ISurfaceComposer.cpp 17.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// tag as surfaceflinger
#define LOG_TAG "SurfaceFlinger"

#include <stdint.h>
#include <sys/types.h>

23 24 25 26
#include <binder/Parcel.h>
#include <binder/IMemory.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
27

28 29
#include <gui/BitTube.h>
#include <gui/IDisplayEventConnection.h>
Mathias Agopian's avatar
Mathias Agopian committed
30
#include <gui/ISurfaceComposer.h>
31
#include <gui/IGraphicBufferProducer.h>
32

Mathias Agopian's avatar
Mathias Agopian committed
33
#include <private/gui/LayerState.h>
34

Mathias Agopian's avatar
Mathias Agopian committed
35
#include <ui/DisplayInfo.h>
36
#include <ui/DisplayStatInfo.h>
37

38
#include <utils/Log.h>
39

40 41 42 43
// ---------------------------------------------------------------------------

namespace android {

44 45
class IDisplayEventConnection;

46 47 48 49 50 51 52 53
class BpSurfaceComposer : public BpInterface<ISurfaceComposer>
{
public:
    BpSurfaceComposer(const sp<IBinder>& impl)
        : BpInterface<ISurfaceComposer>(impl)
    {
    }

54 55
    virtual ~BpSurfaceComposer();

56
    virtual sp<ISurfaceComposerClient> createConnection()
57 58 59 60
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
61
        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
62 63
    }

64 65 66 67 68 69 70 71
    virtual sp<IGraphicBufferAlloc> createGraphicBufferAlloc()
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::CREATE_GRAPHIC_BUFFER_ALLOC, data, &reply);
        return interface_cast<IGraphicBufferAlloc>(reply.readStrongBinder());
    }

72 73 74 75
    virtual void setTransactionState(
            const Vector<ComposerState>& state,
            const Vector<DisplayState>& displays,
            uint32_t flags)
76 77 78
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
79 80 81 82

        data.writeUint32(static_cast<uint32_t>(state.size()));
        for (const auto& s : state) {
            s.write(data);
83
        }
84 85 86 87

        data.writeUint32(static_cast<uint32_t>(displays.size()));
        for (const auto& d : displays) {
            d.write(data);
88
        }
89 90

        data.writeUint32(flags);
91
        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
92 93 94 95 96 97 98 99 100
    }

    virtual void bootFinished()
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
    }

101 102
    virtual status_t captureScreen(const sp<IBinder>& display,
            const sp<IGraphicBufferProducer>& producer,
103
            Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
104
            uint32_t minLayerZ, uint32_t maxLayerZ,
105 106
            bool useIdentityTransform,
            ISurfaceComposer::Rotation rotation)
107 108 109 110
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(display);
111
        data.writeStrongBinder(IInterface::asBinder(producer));
112
        data.write(sourceCrop);
113 114 115 116
        data.writeUint32(reqWidth);
        data.writeUint32(reqHeight);
        data.writeUint32(minLayerZ);
        data.writeUint32(maxLayerZ);
117
        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
118
        data.writeInt32(static_cast<int32_t>(rotation));
119 120 121 122
        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
        return reply.readInt32();
    }

123
    virtual bool authenticateSurfaceTexture(
124
            const sp<IGraphicBufferProducer>& bufferProducer) const
125 126 127 128 129 130
    {
        Parcel data, reply;
        int err = NO_ERROR;
        err = data.writeInterfaceToken(
                ISurfaceComposer::getInterfaceDescriptor());
        if (err != NO_ERROR) {
131
            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
132 133 134
                    "interface descriptor: %s (%d)", strerror(-err), -err);
            return false;
        }
135
        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
136
        if (err != NO_ERROR) {
137
            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
138
                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
139 140 141 142 143
            return false;
        }
        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
                &reply);
        if (err != NO_ERROR) {
144
            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
145
                    "performing transaction: %s (%d)", strerror(-err), -err);
146 147 148 149 150
            return false;
        }
        int32_t result = 0;
        err = reply.readInt32(&result);
        if (err != NO_ERROR) {
151
            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
152
                    "retrieving result: %s (%d)", strerror(-err), -err);
153 154 155 156
            return false;
        }
        return result != 0;
    }
157 158 159 160 161 162 163 164 165 166 167 168 169 170

    virtual sp<IDisplayEventConnection> createDisplayEventConnection()
    {
        Parcel data, reply;
        sp<IDisplayEventConnection> result;
        int err = data.writeInterfaceToken(
                ISurfaceComposer::getInterfaceDescriptor());
        if (err != NO_ERROR) {
            return result;
        }
        err = remote()->transact(
                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
                data, &reply);
        if (err != NO_ERROR) {
171
            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
172 173 174 175 176 177
                    "transaction: %s (%d)", strerror(-err), -err);
            return result;
        }
        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
        return result;
    }
178

179
    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
Mathias Agopian's avatar
Mathias Agopian committed
180 181 182
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
183
        data.writeString8(displayName);
184
        data.writeInt32(secure ? 1 : 0);
Mathias Agopian's avatar
Mathias Agopian committed
185 186 187 188
        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
        return reply.readStrongBinder();
    }

189 190 191 192 193 194 195 196
    virtual void destroyDisplay(const sp<IBinder>& display)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(display);
        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
    }

Mathias Agopian's avatar
Mathias Agopian committed
197 198 199 200 201 202 203 204 205
    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeInt32(id);
        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
        return reply.readStrongBinder();
    }

206
    virtual void setPowerMode(const sp<IBinder>& display, int mode)
207 208 209
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
210
        data.writeStrongBinder(display);
211 212
        data.writeInt32(mode);
        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
213
    }
214

215 216
    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
            Vector<DisplayInfo>* configs)
217 218 219
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
220
        data.writeStrongBinder(display);
221 222 223
        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
        status_t result = reply.readInt32();
        if (result == NO_ERROR) {
224
            size_t numConfigs = reply.readUint32();
225 226 227 228 229 230 231 232 233 234 235
            configs->clear();
            configs->resize(numConfigs);
            for (size_t c = 0; c < numConfigs; ++c) {
                memcpy(&(configs->editItemAt(c)),
                        reply.readInplace(sizeof(DisplayInfo)),
                        sizeof(DisplayInfo));
            }
        }
        return result;
    }

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
    virtual status_t getDisplayStats(const sp<IBinder>& display,
            DisplayStatInfo* stats)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(display);
        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
        status_t result = reply.readInt32();
        if (result == NO_ERROR) {
            memcpy(stats,
                    reply.readInplace(sizeof(DisplayStatInfo)),
                    sizeof(DisplayStatInfo));
        }
        return result;
    }

252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
    virtual int getActiveConfig(const sp<IBinder>& display)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(display);
        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
        return reply.readInt32();
    }

    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        data.writeStrongBinder(display);
        data.writeInt32(id);
        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
268 269
        return reply.readInt32();
    }
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

    virtual status_t clearAnimationFrameStats() {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
        return reply.readInt32();
    }

    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
        reply.read(*outStats);
        return reply.readInt32();
    }
285 286
};

287 288 289 290
// Out-of-line virtual method definition to trigger vtable emission in this
// translation unit (see clang warning -Wweak-vtables)
BpSurfaceComposer::~BpSurfaceComposer() {}

291 292 293 294 295 296 297 298 299
IMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");

// ----------------------------------------------------------------------

status_t BnSurfaceComposer::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case CREATE_CONNECTION: {
300
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
301
            sp<IBinder> b = IInterface::asBinder(createConnection());
302
            reply->writeStrongBinder(b);
303 304
            return NO_ERROR;
        }
305 306
        case CREATE_GRAPHIC_BUFFER_ALLOC: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
307
            sp<IBinder> b = IInterface::asBinder(createGraphicBufferAlloc());
308
            reply->writeStrongBinder(b);
309 310
            return NO_ERROR;
        }
311
        case SET_TRANSACTION_STATE: {
312
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
313 314

            size_t count = data.readUint32();
315 316 317
            if (count > data.dataSize()) {
                return BAD_VALUE;
            }
318 319 320
            ComposerState s;
            Vector<ComposerState> state;
            state.setCapacity(count);
321
            for (size_t i = 0; i < count; i++) {
322 323 324
                if (s.read(data) == BAD_VALUE) {
                    return BAD_VALUE;
                }
325 326
                state.add(s);
            }
327 328

            count = data.readUint32();
329 330 331
            if (count > data.dataSize()) {
                return BAD_VALUE;
            }
332 333 334
            DisplayState d;
            Vector<DisplayState> displays;
            displays.setCapacity(count);
335
            for (size_t i = 0; i < count; i++) {
336 337 338
                if (d.read(data) == BAD_VALUE) {
                    return BAD_VALUE;
                }
339 340
                displays.add(d);
            }
341 342 343

            uint32_t stateFlags = data.readUint32();
            setTransactionState(state, displays, stateFlags);
344 345
            return NO_ERROR;
        }
346
        case BOOT_FINISHED: {
347
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
348
            bootFinished();
349 350
            return NO_ERROR;
        }
351 352 353 354 355
        case CAPTURE_SCREEN: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IBinder> display = data.readStrongBinder();
            sp<IGraphicBufferProducer> producer =
                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
356
            Rect sourceCrop(Rect::EMPTY_RECT);
357
            data.read(sourceCrop);
358 359 360 361
            uint32_t reqWidth = data.readUint32();
            uint32_t reqHeight = data.readUint32();
            uint32_t minLayerZ = data.readUint32();
            uint32_t maxLayerZ = data.readUint32();
362
            bool useIdentityTransform = static_cast<bool>(data.readInt32());
363
            int32_t rotation = data.readInt32();
364

365
            status_t res = captureScreen(display, producer,
366
                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
367 368
                    useIdentityTransform,
                    static_cast<ISurfaceComposer::Rotation>(rotation));
369
            reply->writeInt32(res);
370 371
            return NO_ERROR;
        }
372 373
        case AUTHENTICATE_SURFACE: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
374 375 376
            sp<IGraphicBufferProducer> bufferProducer =
                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
377
            reply->writeInt32(result);
378 379
            return NO_ERROR;
        }
380 381 382
        case CREATE_DISPLAY_EVENT_CONNECTION: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IDisplayEventConnection> connection(createDisplayEventConnection());
383
            reply->writeStrongBinder(IInterface::asBinder(connection));
384
            return NO_ERROR;
385
        }
Mathias Agopian's avatar
Mathias Agopian committed
386 387
        case CREATE_DISPLAY: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
388
            String8 displayName = data.readString8();
389 390
            bool secure = bool(data.readInt32());
            sp<IBinder> display(createDisplay(displayName, secure));
Mathias Agopian's avatar
Mathias Agopian committed
391 392
            reply->writeStrongBinder(display);
            return NO_ERROR;
393 394 395 396 397 398 399
        }
        case DESTROY_DISPLAY: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IBinder> display = data.readStrongBinder();
            destroyDisplay(display);
            return NO_ERROR;
        }
Mathias Agopian's avatar
Mathias Agopian committed
400 401 402 403 404 405
        case GET_BUILT_IN_DISPLAY: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            int32_t id = data.readInt32();
            sp<IBinder> display(getBuiltInDisplay(id));
            reply->writeStrongBinder(display);
            return NO_ERROR;
406
        }
407 408 409 410 411 412 413
        case GET_DISPLAY_CONFIGS: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            Vector<DisplayInfo> configs;
            sp<IBinder> display = data.readStrongBinder();
            status_t result = getDisplayConfigs(display, &configs);
            reply->writeInt32(result);
            if (result == NO_ERROR) {
414
                reply->writeUint32(static_cast<uint32_t>(configs.size()));
415 416 417 418 419 420 421
                for (size_t c = 0; c < configs.size(); ++c) {
                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
                            &configs[c], sizeof(DisplayInfo));
                }
            }
            return NO_ERROR;
        }
422 423 424 425 426 427 428 429 430 431 432 433
        case GET_DISPLAY_STATS: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            DisplayStatInfo stats;
            sp<IBinder> display = data.readStrongBinder();
            status_t result = getDisplayStats(display, &stats);
            reply->writeInt32(result);
            if (result == NO_ERROR) {
                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
                        &stats, sizeof(DisplayStatInfo));
            }
            return NO_ERROR;
        }
434 435 436 437 438 439 440 441
        case GET_ACTIVE_CONFIG: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IBinder> display = data.readStrongBinder();
            int id = getActiveConfig(display);
            reply->writeInt32(id);
            return NO_ERROR;
        }
        case SET_ACTIVE_CONFIG: {
442
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
443
            sp<IBinder> display = data.readStrongBinder();
444 445
            int id = data.readInt32();
            status_t result = setActiveConfig(display, id);
446
            reply->writeInt32(result);
447 448
            return NO_ERROR;
        }
449 450 451 452 453 454 455 456 457 458 459 460 461 462
        case CLEAR_ANIMATION_FRAME_STATS: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            status_t result = clearAnimationFrameStats();
            reply->writeInt32(result);
            return NO_ERROR;
        }
        case GET_ANIMATION_FRAME_STATS: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            FrameStats stats;
            status_t result = getAnimationFrameStats(&stats);
            reply->write(stats);
            reply->writeInt32(result);
            return NO_ERROR;
        }
463 464 465 466 467 468 469
        case SET_POWER_MODE: {
            CHECK_INTERFACE(ISurfaceComposer, data, reply);
            sp<IBinder> display = data.readStrongBinder();
            int32_t mode = data.readInt32();
            setPowerMode(display, mode);
            return NO_ERROR;
        }
470
        default: {
471
            return BBinder::onTransact(code, data, reply, flags);
472
        }
473 474 475 476 477 478
    }
}

// ----------------------------------------------------------------------------

};