ISurfaceComposer.cpp revision c666cae2d5995097ec49a87e375e2afdd92802b7
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// tag as surfaceflinger 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceFlinger" 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 24c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IPCThreadState.h> 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/BitTube.h> 29d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h> 3090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceTexture.h> 32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 3390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h> 36582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection; 44d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 597e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 629a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 639a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis { 649a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis uint32_t n; 659a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Parcel data, reply; 669a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 679a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 689a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 718b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian virtual void setTransactionState( 728b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<ComposerState>& state, 738b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian const Vector<DisplayState>& displays, 748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian uint32_t flags) 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 788b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 798b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator b(state.begin()); 808b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<ComposerState>::const_iterator e(state.end()); 818b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(state.size()); 828b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 838b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 848b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 868b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian { 878b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator b(displays.begin()); 888b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState>::const_iterator e(displays.end()); 898b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian data.writeInt32(displays.size()); 908b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for ( ; b != e ; ++b ) { 918b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian b->write(data); 928b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 9428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis data.writeInt32(flags); 95b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1051b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian virtual status_t captureScreen(DisplayID dpy, 1061b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap>* heap, 107df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t* width, uint32_t* height, PixelFormat* format, 108bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t reqWidth, uint32_t reqHeight, 109bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) 1101b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian { 1111b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian Parcel data, reply; 1121b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1131b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian data.writeInt32(dpy); 114df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian data.writeInt32(reqWidth); 115df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian data.writeInt32(reqHeight); 116bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian data.writeInt32(minLayerZ); 117bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian data.writeInt32(maxLayerZ); 1181b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 1191b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder()); 1201b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *width = reply.readInt32(); 1211b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *height = reply.readInt32(); 1221b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *format = reply.readInt32(); 1231b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return reply.readInt32(); 1241b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 1251b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 12659119e658a12279e8fff508f8773843de2d90917Mathias Agopian virtual status_t turnElectronBeamOff(int32_t mode) 12759119e658a12279e8fff508f8773843de2d90917Mathias Agopian { 12859119e658a12279e8fff508f8773843de2d90917Mathias Agopian Parcel data, reply; 12959119e658a12279e8fff508f8773843de2d90917Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 13059119e658a12279e8fff508f8773843de2d90917Mathias Agopian data.writeInt32(mode); 13159119e658a12279e8fff508f8773843de2d90917Mathias Agopian remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply); 13259119e658a12279e8fff508f8773843de2d90917Mathias Agopian return reply.readInt32(); 13359119e658a12279e8fff508f8773843de2d90917Mathias Agopian } 13459119e658a12279e8fff508f8773843de2d90917Mathias Agopian 1359daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian virtual status_t turnElectronBeamOn(int32_t mode) 1369daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian { 1379daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian Parcel data, reply; 1389daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1399daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian data.writeInt32(mode); 1409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply); 1419daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian return reply.readInt32(); 1429daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian } 1439daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian 144582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 145582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis const sp<ISurfaceTexture>& surfaceTexture) const 146134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 147134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 152e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 156582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis err = data.writeStrongBinder(surfaceTexture->asBinder()); 157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 158e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 159582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 160134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 162134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 163134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 165e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 166582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 167134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 169134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 170134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 171134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 172e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 173582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 176134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 177134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 178d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 179d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual sp<IDisplayEventConnection> createDisplayEventConnection() 180d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 181d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 182d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 183d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 184d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 185d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 186d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 187d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 188d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 189d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 190d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 191d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 192e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 193d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 194d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 195d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 196d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 197d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 198d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 1998e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 2008e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross virtual void blank() 2018e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2028e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2038e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2048e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross remote()->transact(BnSurfaceComposer::BLANK, data, &reply); 2058e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2068e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross 2078e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross virtual void unblank() 2088e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross { 2098e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross Parcel data, reply; 2108e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2118e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross remote()->transact(BnSurfaceComposer::UNBLANK, data, &reply); 2128e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } 2133094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian 214c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian virtual status_t getDisplayInfo(DisplayID dpy, DisplayInfo* info) 215c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian { 216c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian Parcel data, reply; 217c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 218c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian data.writeInt32(dpy); 219c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian remote()->transact(BnSurfaceComposer::GET_DISPLAY_INFO, data, &reply); 220c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian memcpy(info, reply.readInplace(sizeof(DisplayInfo)), sizeof(DisplayInfo)); 221c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian return reply.readInt32(); 222c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } 223c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 224c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian 2253094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian virtual void connectDisplay(const sp<ISurfaceTexture> display) { 2263094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian Parcel data, reply; 2273094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 2283094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian data.writeStrongBinder(display->asBinder()); 2293094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian remote()->transact(BnSurfaceComposer::CONNECT_DISPLAY, data, &reply); 2303094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian } 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 24283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 2469a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis case CREATE_GRAPHIC_BUFFER_ALLOC: { 2479a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 2489a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 2499a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis reply->writeStrongBinder(b); 2509a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } break; 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 25283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian size_t count = data.readInt32(); 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for (size_t i=0 ; i<count ; i++) { 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.read(data); 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 2618b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian count = data.readInt32(); 2628b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian DisplayState d; 2638b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displays; 2648b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.setCapacity(count); 2658b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian for (size_t i=0 ; i<count ; i++) { 2668b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian d.read(data); 2678b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian displays.add(d); 2688b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian } 26928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = data.readInt32(); 2708b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian setTransactionState(state, displays, flags); 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 27383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 2761b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian case CAPTURE_SCREEN: { 2771b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 2781b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian DisplayID dpy = data.readInt32(); 279df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t reqWidth = data.readInt32(); 280df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t reqHeight = data.readInt32(); 281bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ = data.readInt32(); 282bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t maxLayerZ = data.readInt32(); 2831b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap> heap; 2841b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian uint32_t w, h; 2851b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian PixelFormat f; 286df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian status_t res = captureScreen(dpy, &heap, &w, &h, &f, 287bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian reqWidth, reqHeight, minLayerZ, maxLayerZ); 2881b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeStrongBinder(heap->asBinder()); 2891b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(w); 2901b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(h); 2911b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(f); 2921b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(res); 2931b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } break; 29459119e658a12279e8fff508f8773843de2d90917Mathias Agopian case TURN_ELECTRON_BEAM_OFF: { 29559119e658a12279e8fff508f8773843de2d90917Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 29659119e658a12279e8fff508f8773843de2d90917Mathias Agopian int32_t mode = data.readInt32(); 29759119e658a12279e8fff508f8773843de2d90917Mathias Agopian status_t res = turnElectronBeamOff(mode); 29859119e658a12279e8fff508f8773843de2d90917Mathias Agopian reply->writeInt32(res); 299151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis } break; 3009daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian case TURN_ELECTRON_BEAM_ON: { 3019daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3029daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian int32_t mode = data.readInt32(); 3039daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian status_t res = turnElectronBeamOn(mode); 3049daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian reply->writeInt32(res); 305151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis } break; 306134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 307134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 308582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis sp<ISurfaceTexture> surfaceTexture = 309582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis interface_cast<ISurfaceTexture>(data.readStrongBinder()); 310582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0; 311134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 312134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } break; 313d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 314d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 315d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 316d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian reply->writeStrongBinder(connection->asBinder()); 317d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 318d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } break; 3198e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case BLANK: { 3208e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross CHECK_INTERFACE(ISurfaceComposer, data, reply); 3218e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross blank(); 3228e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } break; 3238e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross case UNBLANK: { 3248e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross CHECK_INTERFACE(ISurfaceComposer, data, reply); 3258e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross unblank(); 3268e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross } break; 327c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian case GET_DISPLAY_INFO: { 328c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 329c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian DisplayInfo info; 330c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian DisplayID dpy = data.readInt32(); 331c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian status_t result = getDisplayInfo(dpy, &info); 332c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian memcpy(reply->writeInplace(sizeof(DisplayInfo)), &info, sizeof(DisplayInfo)); 333c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian reply->writeInt32(result); 334c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian } break; 3353094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian case CONNECT_DISPLAY: { 3363094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 3373094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian sp<ISurfaceTexture> surfaceTexture = 3383094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian interface_cast<ISurfaceTexture>(data.readStrongBinder()); 3393094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian connectDisplay(surfaceTexture); 3403094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian } break; 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 34283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 350