ISurface.cpp revision edbf3b6af777b721cd2a1ef461947e51e88241e1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Parcel.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/IMemory.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/ISurface.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Overlay.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectISurface::BufferHeap::BufferHeap()
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : w(0), h(0), hor_stride(0), ver_stride(0), format(0),
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    transform(0), flags(0)
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t hor_stride, int32_t ver_stride,
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format, const sp<IMemoryHeap>& heap)
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      format(format), transform(0), flags(0), heap(heap)
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int32_t hor_stride, int32_t ver_stride,
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format, uint32_t transform, uint32_t flags,
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const sp<IMemoryHeap>& heap)
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project          format(format), transform(transform), flags(flags), heap(heap)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectISurface::BufferHeap::~BufferHeap()
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurface : public BpInterface<ISurface>
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpSurface(const sp<IBinder>& impl)
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurface>(impl)
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t registerBuffers(const BufferHeap& buffers)
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.w);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.h);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.hor_stride);
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.ver_stride);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.format);
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.transform);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(buffers.flags);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeStrongBinder(buffers.heap->asBinder());
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(REGISTER_BUFFERS, data, &reply);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        status_t result = reply.readInt32();
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return result;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void postBuffer(ssize_t offset)
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(offset);
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void unregisterBuffers()
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(UNREGISTER_BUFFERS, data, &reply);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual sp<OverlayRef> createOverlay(
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project             uint32_t w, uint32_t h, int32_t format)
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(w);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(h);
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInt32(format);
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(CREATE_OVERLAY, data, &reply);
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return OverlayRef::readFromParcel(reply);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(Surface, "android.ui.ISurface");
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define CHECK_INTERFACE(interface, data, reply) \
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            LOGW("Call incorrectly routed to " #interface); \
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return PERMISSION_DENIED; \
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } } while (0)
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurface::onTransact(
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case REGISTER_BUFFERS: {
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            BufferHeap buffer;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.w = data.readInt32();
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.h = data.readInt32();
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.hor_stride = data.readInt32();
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.ver_stride= data.readInt32();
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.format = data.readInt32();
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.transform = data.readInt32();
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.flags = data.readInt32();
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            buffer.heap = interface_cast<IMemoryHeap>(data.readStrongBinder());
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t err = registerBuffers(buffer);
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeInt32(err);
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case UNREGISTER_BUFFERS: {
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            unregisterBuffers();
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case POST_BUFFER: {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ssize_t offset = data.readInt32();
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            postBuffer(offset);
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_OVERLAY: {
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int w = data.readInt32();
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int h = data.readInt32();
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int f = data.readInt32();
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            sp<OverlayRef> o = createOverlay(w, h, f);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return OverlayRef::writeToParcel(reply, o);
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } break;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
165