ISurface.cpp revision 000479f9e325b4e426a67033abd92d47da412725
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian#define LOG_TAG "ISurface"
181473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
230795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h>
240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IMemory.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Overlay.h>
276950e428feaccc8164b989ef64e771a99948797aMathias Agopian#include <ui/GraphicBuffer.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/Surface.h>
30000479f9e325b4e426a67033abd92d47da412725Mathias Agopian#include <surfaceflinger/ISurface.h>
31000479f9e325b4e426a67033abd92d47da412725Mathias Agopian
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
341473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// ----------------------------------------------------------------------
351473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectISurface::BufferHeap::BufferHeap()
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : w(0), h(0), hor_stride(0), ver_stride(0), format(0),
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    transform(0), flags(0)
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t hor_stride, int32_t ver_stride,
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PixelFormat format, const sp<IMemoryHeap>& heap)
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project      format(format), transform(0), flags(0), heap(heap)
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t hor_stride, int32_t ver_stride,
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PixelFormat format, uint32_t transform, uint32_t flags,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const sp<IMemoryHeap>& heap)
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project          format(format), transform(transform), flags(flags), heap(heap)
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectISurface::BufferHeap::~BufferHeap()
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
641473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian// ----------------------------------------------------------------------
651473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpSurface : public BpInterface<ISurface>
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BpSurface(const sp<IBinder>& impl)
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        : BpInterface<ISurface>(impl)
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
746950e428feaccc8164b989ef64e771a99948797aMathias Agopian    virtual sp<GraphicBuffer> requestBuffer(int bufferIdx, int usage)
751473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    {
761473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        Parcel data, reply;
771473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
789779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian        data.writeInt32(bufferIdx);
795cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian        data.writeInt32(usage);
809779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian        remote()->transact(REQUEST_BUFFER, data, &reply);
816950e428feaccc8164b989ef64e771a99948797aMathias Agopian        sp<GraphicBuffer> buffer = new GraphicBuffer(reply);
821473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        return buffer;
831473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian    }
841473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t registerBuffers(const BufferHeap& buffers)
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.w);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.h);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.hor_stride);
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.ver_stride);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.format);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.transform);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(buffers.flags);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStrongBinder(buffers.heap->asBinder());
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(REGISTER_BUFFERS, data, &reply);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        status_t result = reply.readInt32();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void postBuffer(ssize_t offset)
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(offset);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void unregisterBuffers()
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(UNREGISTER_BUFFERS, data, &reply);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual sp<OverlayRef> createOverlay(
118e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang             uint32_t w, uint32_t h, int32_t format, int32_t orientation)
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data, reply;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(w);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(h);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeInt32(format);
125e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang        data.writeInt32(orientation);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        remote()->transact(CREATE_OVERLAY, data, &reply);
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return OverlayRef::readFromParcel(reply);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(Surface, "android.ui.ISurface");
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnSurface::onTransact(
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch(code) {
1399779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian        case REQUEST_BUFFER: {
1401473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian            CHECK_INTERFACE(ISurface, data, reply);
1419779b221e999583ff89e0dfc40e56398737adbb3Mathias Agopian            int bufferIdx = data.readInt32();
1425cec4742b3a1d7448bd32ae57cb4cf70b484c64cMathias Agopian            int usage = data.readInt32();
1436950e428feaccc8164b989ef64e771a99948797aMathias Agopian            sp<GraphicBuffer> buffer(requestBuffer(bufferIdx, usage));
1446950e428feaccc8164b989ef64e771a99948797aMathias Agopian            return GraphicBuffer::writeToParcel(reply, buffer.get());
1451473f46cbc82aa6f0ba744cc896a36923823d55bMathias Agopian        }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case REGISTER_BUFFERS: {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BufferHeap buffer;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.w = data.readInt32();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.h = data.readInt32();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.hor_stride = data.readInt32();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.ver_stride= data.readInt32();
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.format = data.readInt32();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.transform = data.readInt32();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.flags = data.readInt32();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.heap = interface_cast<IMemoryHeap>(data.readStrongBinder());
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t err = registerBuffers(buffer);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply->writeInt32(err);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case UNREGISTER_BUFFERS: {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unregisterBuffers();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case POST_BUFFER: {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t offset = data.readInt32();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            postBuffer(offset);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NO_ERROR;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case CREATE_OVERLAY: {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            CHECK_INTERFACE(ISurface, data, reply);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int w = data.readInt32();
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int h = data.readInt32();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int f = data.readInt32();
177e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang            int orientation = data.readInt32();
178e1ceec234c618729cc7bd35fecb11744b52c1cc8Chih-Chung Chang            sp<OverlayRef> o = createOverlay(w, h, f, orientation);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return OverlayRef::writeToParcel(reply, o);
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BBinder::onTransact(code, data, reply, flags);
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
187