ISurfaceComposer.cpp revision d0566bc26fcf6ca396118701fa11900b627f2c09
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 28698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian#include <private/surfaceflinger/LayerState.h> 29698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h> 31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/BitTube.h> 33d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h> 34d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/DisplayInfo.h> 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis#include <gui/ISurfaceTexture.h> 38582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 50d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianclass IDisplayEventConnection; 51d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer> 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpSurfaceComposer(const sp<IBinder>& impl) 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<ISurfaceComposer>(impl) 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 607e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian virtual sp<ISurfaceComposerClient> createConnection() 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t n; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply); 667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder()); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 699a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc() 709a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis { 719a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis uint32_t n; 729a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis Parcel data, reply; 739a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 749a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply); 759a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder()); 769a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } 779a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis 787303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian virtual sp<IMemoryHeap> getCblk() const 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::GET_CBLK, data, &reply); 837303c6bf1a8b00a0e7d8165d774a1f259b4ccda9Mathias Agopian return interface_cast<IMemoryHeap>(reply.readStrongBinder()); 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 86b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis virtual void setTransactionState(const Vector<ComposerState>& state, 8728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis int orientation, uint32_t flags) 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 91698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState>::const_iterator b(state.begin()); 92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState>::const_iterator e(state.end()); 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian data.writeInt32(state.size()); 94698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for ( ; b != e ; ++b ) { 95698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian b->write(data); 96698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(orientation); 9828378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis data.writeInt32(flags); 99b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply); 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual void bootFinished() 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1091b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian virtual status_t captureScreen(DisplayID dpy, 1101b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap>* heap, 111df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t* width, uint32_t* height, PixelFormat* format, 112bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t reqWidth, uint32_t reqHeight, 113bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) 1141b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian { 1151b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian Parcel data, reply; 1161b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1171b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian data.writeInt32(dpy); 118df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian data.writeInt32(reqWidth); 119df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian data.writeInt32(reqHeight); 120bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian data.writeInt32(minLayerZ); 121bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian data.writeInt32(maxLayerZ); 1221b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply); 1231b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *heap = interface_cast<IMemoryHeap>(reply.readStrongBinder()); 1241b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *width = reply.readInt32(); 1251b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *height = reply.readInt32(); 1261b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian *format = reply.readInt32(); 1271b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian return reply.readInt32(); 1281b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } 1291b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian 13059119e658a12279e8fff508f8773843de2d90917Mathias Agopian virtual status_t turnElectronBeamOff(int32_t mode) 13159119e658a12279e8fff508f8773843de2d90917Mathias Agopian { 13259119e658a12279e8fff508f8773843de2d90917Mathias Agopian Parcel data, reply; 13359119e658a12279e8fff508f8773843de2d90917Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 13459119e658a12279e8fff508f8773843de2d90917Mathias Agopian data.writeInt32(mode); 13559119e658a12279e8fff508f8773843de2d90917Mathias Agopian remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_OFF, data, &reply); 13659119e658a12279e8fff508f8773843de2d90917Mathias Agopian return reply.readInt32(); 13759119e658a12279e8fff508f8773843de2d90917Mathias Agopian } 13859119e658a12279e8fff508f8773843de2d90917Mathias Agopian 1399daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian virtual status_t turnElectronBeamOn(int32_t mode) 1409daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian { 1419daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian Parcel data, reply; 1429daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); 1439daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian data.writeInt32(mode); 1449daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian remote()->transact(BnSurfaceComposer::TURN_ELECTRON_BEAM_ON, data, &reply); 1459daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian return reply.readInt32(); 1469daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian } 1479daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian 148582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis virtual bool authenticateSurfaceTexture( 149582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis const sp<ISurfaceTexture>& surfaceTexture) const 150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis { 151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis Parcel data, reply; 152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = NO_ERROR; 153134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = data.writeInterfaceToken( 154134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ISurfaceComposer::getInterfaceDescriptor()); 155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 156582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis "interface descriptor: %s (%d)", strerror(-err), -err); 158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 159134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 160582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis err = data.writeStrongBinder(surfaceTexture->asBinder()); 161134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 162582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis LOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing " 163582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "strong binder to parcel: %s (%d)", strerror(-err), -err); 164134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 165134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 166134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data, 167134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &reply); 168134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 169582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis LOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 170582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "performing transaction: %s (%d)", strerror(-err), -err); 171134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 172134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 173134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int32_t result = 0; 174134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis err = reply.readInt32(&result); 175134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis if (err != NO_ERROR) { 176582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis LOGE("ISurfaceComposer::authenticateSurfaceTexture: error " 177582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis "retrieving result: %s (%d)", strerror(-err), -err); 178134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return false; 179134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 180134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis return result != 0; 181134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 182d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian 183d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian virtual sp<IDisplayEventConnection> createDisplayEventConnection() 184d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian { 185d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian Parcel data, reply; 186d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> result; 187d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian int err = data.writeInterfaceToken( 188d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian ISurfaceComposer::getInterfaceDescriptor()); 189d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 190d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 191d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 192d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian err = remote()->transact( 193d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION, 194d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian data, &reply); 195d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian if (err != NO_ERROR) { 196d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian LOGE("ISurfaceComposer::createDisplayEventConnection: error performing " 197d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian "transaction: %s (%d)", strerror(-err), -err); 198d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 199d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 200d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder()); 201d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return result; 202d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer"); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact( 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch(code) { 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case CREATE_CONNECTION: { 21483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = createConnection()->asBinder(); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 2189a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis case CREATE_GRAPHIC_BUFFER_ALLOC: { 2199a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 2209a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis sp<IBinder> b = createGraphicBufferAlloc()->asBinder(); 2219a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis reply->writeStrongBinder(b); 2229a78c90cd46b2a3bd637b056873149d3b94384b4Jamie Gennis } break; 223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian case SET_TRANSACTION_STATE: { 22483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian size_t count = data.readInt32(); 226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> state; 228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.setCapacity(count); 229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian for (size_t i=0 ; i<count ; i++) { 230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.read(data); 231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian state.add(s); 232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int orientation = data.readInt32(); 23428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = data.readInt32(); 23528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis setTransactionState(state, orientation, flags); 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case BOOT_FINISHED: { 23883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bootFinished(); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GET_CBLK: { 24283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> b = getCblk()->asBinder(); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reply->writeStrongBinder(b); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } break; 2461b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian case CAPTURE_SCREEN: { 2471b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 2481b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian DisplayID dpy = data.readInt32(); 249df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t reqWidth = data.readInt32(); 250df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian uint32_t reqHeight = data.readInt32(); 251bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ = data.readInt32(); 252bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t maxLayerZ = data.readInt32(); 2531b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian sp<IMemoryHeap> heap; 2541b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian uint32_t w, h; 2551b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian PixelFormat f; 256df85c455c34a920d22a8e3f7459a1cc615efcd27Mathias Agopian status_t res = captureScreen(dpy, &heap, &w, &h, &f, 257bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian reqWidth, reqHeight, minLayerZ, maxLayerZ); 2581b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeStrongBinder(heap->asBinder()); 2591b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(w); 2601b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(h); 2611b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(f); 2621b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian reply->writeInt32(res); 2631b0b30d04304392748a8a4ab5a69e52a19f51b3aMathias Agopian } break; 26459119e658a12279e8fff508f8773843de2d90917Mathias Agopian case TURN_ELECTRON_BEAM_OFF: { 26559119e658a12279e8fff508f8773843de2d90917Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 26659119e658a12279e8fff508f8773843de2d90917Mathias Agopian int32_t mode = data.readInt32(); 26759119e658a12279e8fff508f8773843de2d90917Mathias Agopian status_t res = turnElectronBeamOff(mode); 26859119e658a12279e8fff508f8773843de2d90917Mathias Agopian reply->writeInt32(res); 269151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis } break; 2709daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian case TURN_ELECTRON_BEAM_ON: { 2719daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 2729daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian int32_t mode = data.readInt32(); 2739daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian status_t res = turnElectronBeamOn(mode); 2749daa5c9b9dd286cbbf5d43f7e45a5e9e4048e855Mathias Agopian reply->writeInt32(res); 275151f2f5a6c5c7922c9f4a68c75706000e4a23fddJamie Gennis } break; 276134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis case AUTHENTICATE_SURFACE: { 277134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis CHECK_INTERFACE(ISurfaceComposer, data, reply); 278582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis sp<ISurfaceTexture> surfaceTexture = 279582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis interface_cast<ISurfaceTexture>(data.readStrongBinder()); 280582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis int32_t result = authenticateSurfaceTexture(surfaceTexture) ? 1 : 0; 281134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis reply->writeInt32(result); 282134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } break; 283d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian case CREATE_DISPLAY_EVENT_CONNECTION: { 284d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian CHECK_INTERFACE(ISurfaceComposer, data, reply); 285d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian sp<IDisplayEventConnection> connection(createDisplayEventConnection()); 286d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian reply->writeStrongBinder(connection->asBinder()); 287d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian return NO_ERROR; 288d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian } break; 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 29083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian return BBinder::onTransact(code, data, reply, flags); 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 298