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