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/IPCThreadState.h>
25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/IDisplayEventConnection.h>
282adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden#include <gui/IGraphicBufferProducer.h>
292b5dd4062dd951b2cafc4b80bd3a1813b013d71aMathias Agopian#include <gui/ISurfaceComposer.h>
302b5dd4062dd951b2cafc4b80bd3a1813b013d71aMathias Agopian#include <gui/ISurfaceComposerClient.h>
31d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h>
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright#include <system/graphics.h>
3528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <ui/DisplayInfo.h>
3767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar#include <ui/DisplayStatInfo.h>
38c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza#include <ui/HdrCapabilities.h>
39582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/Log.h>
419cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpSurfaceComposer : public BpInterface<ISurfaceComposer>
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
49e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh    explicit BpSurfaceComposer(const sp<IBinder>& impl)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        : BpInterface<ISurfaceComposer>(impl)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza    virtual ~BpSurfaceComposer();
55d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
567e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian    virtual sp<ISurfaceComposerClient> createConnection()
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::CREATE_CONNECTION, data, &reply);
617e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
641db73f66624e7d151710483dd58e03eed672f064Robert Carr    virtual sp<ISurfaceComposerClient> createScopedConnection(
651db73f66624e7d151710483dd58e03eed672f064Robert Carr            const sp<IGraphicBufferProducer>& parent)
661db73f66624e7d151710483dd58e03eed672f064Robert Carr    {
671db73f66624e7d151710483dd58e03eed672f064Robert Carr        Parcel data, reply;
681db73f66624e7d151710483dd58e03eed672f064Robert Carr        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
691db73f66624e7d151710483dd58e03eed672f064Robert Carr        data.writeStrongBinder(IInterface::asBinder(parent));
701db73f66624e7d151710483dd58e03eed672f064Robert Carr        remote()->transact(BnSurfaceComposer::CREATE_SCOPED_CONNECTION, data, &reply);
711db73f66624e7d151710483dd58e03eed672f064Robert Carr        return interface_cast<ISurfaceComposerClient>(reply.readStrongBinder());
721db73f66624e7d151710483dd58e03eed672f064Robert Carr    }
731db73f66624e7d151710483dd58e03eed672f064Robert Carr
748b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian    virtual void setTransactionState(
758b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<ComposerState>& state,
768b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            const Vector<DisplayState>& displays,
778b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            uint32_t flags)
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
81d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
82d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(state.size()));
83d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& s : state) {
84d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            s.write(data);
858b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian        }
86d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
87d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(static_cast<uint32_t>(displays.size()));
88d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        for (const auto& d : displays) {
89d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            d.write(data);
90698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        }
91d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
92d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(flags);
93b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis        remote()->transact(BnSurfaceComposer::SET_TRANSACTION_STATE, data, &reply);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void bootFinished()
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Parcel data, reply;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        remote()->transact(BnSurfaceComposer::BOOT_FINISHED, data, &reply);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1032a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    virtual status_t captureScreen(const sp<IBinder>& display,
1042a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            const sp<IGraphicBufferProducer>& producer,
105c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
106ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t minLayerZ, int32_t maxLayerZ,
107c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            bool useIdentityTransform,
108c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews            ISurfaceComposer::Rotation rotation)
1092a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    {
1102a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        Parcel data, reply;
1112a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
1122a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        data.writeStrongBinder(display);
1132ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(producer));
114c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza        data.write(sourceCrop);
115d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqWidth);
116d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza        data.writeUint32(reqHeight);
117ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr        data.writeInt32(minLayerZ);
118ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr        data.writeInt32(maxLayerZ);
119c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza        data.writeInt32(static_cast<int32_t>(useIdentityTransform));
120c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews        data.writeInt32(static_cast<int32_t>(rotation));
1212a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        remote()->transact(BnSurfaceComposer::CAPTURE_SCREEN, data, &reply);
1222a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        return reply.readInt32();
1232a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian    }
1242a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian
125582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    virtual bool authenticateSurfaceTexture(
1262adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            const sp<IGraphicBufferProducer>& bufferProducer) const
127134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    {
128134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        Parcel data, reply;
129134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int err = NO_ERROR;
130134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = data.writeInterfaceToken(
131134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                ISurfaceComposer::getInterfaceDescriptor());
132134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
133e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                    "interface descriptor: %s (%d)", strerror(-err), -err);
135134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
136134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
1372ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen        err = data.writeStrongBinder(IInterface::asBinder(bufferProducer));
138134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
139e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error writing "
140582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "strong binder to parcel: %s (%d)", strerror(-err), -err);
141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
142134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
143134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = remote()->transact(BnSurfaceComposer::AUTHENTICATE_SURFACE, data,
144134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis                &reply);
145134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
146e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
147582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "performing transaction: %s (%d)", strerror(-err), -err);
148134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
149134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
150134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        int32_t result = 0;
151134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        err = reply.readInt32(&result);
152134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        if (err != NO_ERROR) {
153e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::authenticateSurfaceTexture: error "
154582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis                    "retrieving result: %s (%d)", strerror(-err), -err);
155134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            return false;
156134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        }
157134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        return result != 0;
158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
159d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
1606b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    virtual status_t getSupportedFrameTimestamps(
1616b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent>* outSupported) const {
1626b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (!outSupported) {
1636b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return UNEXPECTED_NULL;
1646b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1656b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->clear();
1666b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1676b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        Parcel data, reply;
1686b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        status_t err = data.writeInterfaceToken(
1706b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                ISurfaceComposer::getInterfaceDescriptor());
1716b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1726b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1736b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1746b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1756b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = remote()->transact(
1766b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                BnSurfaceComposer::GET_SUPPORTED_FRAME_TIMESTAMPS,
1776b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                data, &reply);
1786b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1796b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1806b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1816b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1826b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        int32_t result = 0;
1836b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32(&result);
1846b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1856b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1866b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1876b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (result != NO_ERROR) {
1886b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return result;
1896b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1906b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1916b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        std::vector<int32_t> supported;
1926b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        err = reply.readInt32Vector(&supported);
1936b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        if (err != NO_ERROR) {
1946b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return err;
1956b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
1966b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
1976b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        outSupported->reserve(supported.size());
1986b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        for (int32_t s : supported) {
1996b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            outSupported->push_back(static_cast<FrameEvent>(s));
2006b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
2016b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        return NO_ERROR;
2026b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson    }
2036b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
2043e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi    virtual sp<IDisplayEventConnection> createDisplayEventConnection(VsyncSource vsyncSource)
205d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    {
206d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        Parcel data, reply;
207d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        sp<IDisplayEventConnection> result;
208d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int err = data.writeInterfaceToken(
209d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                ISurfaceComposer::getInterfaceDescriptor());
210d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
211d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
212d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
2133e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi        data.writeInt32(static_cast<int32_t>(vsyncSource));
214d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        err = remote()->transact(
215d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                BnSurfaceComposer::CREATE_DISPLAY_EVENT_CONNECTION,
216d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                data, &reply);
217d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        if (err != NO_ERROR) {
218e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("ISurfaceComposer::createDisplayEventConnection: error performing "
219d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                    "transaction: %s (%d)", strerror(-err), -err);
220d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return result;
221d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
222d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        result = interface_cast<IDisplayEventConnection>(reply.readStrongBinder());
223d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        return result;
224d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
2258e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross
226dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis    virtual sp<IBinder> createDisplay(const String8& displayName, bool secure)
227e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
229e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2308dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden        data.writeString8(displayName);
231dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis        data.writeInt32(secure ? 1 : 0);
232e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::CREATE_DISPLAY, data, &reply);
233e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
234e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
235e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2366c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    virtual void destroyDisplay(const sp<IBinder>& display)
2376c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    {
2386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        Parcel data, reply;
2396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2406c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        data.writeStrongBinder(display);
2416c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        remote()->transact(BnSurfaceComposer::DESTROY_DISPLAY, data, &reply);
2426c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall    }
2436c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall
244e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    virtual sp<IBinder> getBuiltInDisplay(int32_t id)
245e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    {
246e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        Parcel data, reply;
247e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
248e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        data.writeInt32(id);
249e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        remote()->transact(BnSurfaceComposer::GET_BUILT_IN_DISPLAY, data, &reply);
250e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        return reply.readStrongBinder();
251e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian    }
252e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian
2532c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani    virtual void setPowerMode(const sp<IBinder>& display, int mode)
2548e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    {
2558e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        Parcel data, reply;
2568e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
257c01a79d77b829e7de86ef137694e8ad708470ca1Andy McFadden        data.writeStrongBinder(display);
2582c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        data.writeInt32(mode);
2592c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        remote()->transact(BnSurfaceComposer::SET_POWER_MODE, data, &reply);
2608e533069e5721e55cb9768e140e16546c3a4a8b6Colin Cross    }
2613094df359d1e6e2ae8ca4e935cc093f563804c96Mathias Agopian
2627f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t getDisplayConfigs(const sp<IBinder>& display,
2637f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo>* configs)
264c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    {
265c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        Parcel data, reply;
266c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
2679d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown        data.writeStrongBinder(display);
2687f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_DISPLAY_CONFIGS, data, &reply);
2697f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        status_t result = reply.readInt32();
2707f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        if (result == NO_ERROR) {
271d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t numConfigs = reply.readUint32();
2727f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->clear();
2737f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            configs->resize(numConfigs);
2747f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            for (size_t c = 0; c < numConfigs; ++c) {
2757f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                memcpy(&(configs->editItemAt(c)),
2767f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        reply.readInplace(sizeof(DisplayInfo)),
2777f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                        sizeof(DisplayInfo));
2787f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
2797f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
2807f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return result;
2817f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
2827f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
28367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    virtual status_t getDisplayStats(const sp<IBinder>& display,
28467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo* stats)
28567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    {
28667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        Parcel data, reply;
28767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
28867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        data.writeStrongBinder(display);
28967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        remote()->transact(BnSurfaceComposer::GET_DISPLAY_STATS, data, &reply);
29067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        status_t result = reply.readInt32();
29167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        if (result == NO_ERROR) {
29267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            memcpy(stats,
29367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    reply.readInplace(sizeof(DisplayStatInfo)),
29467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                    sizeof(DisplayStatInfo));
29567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
29667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        return result;
29767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar    }
29867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar
2997f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual int getActiveConfig(const sp<IBinder>& display)
3007f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3017f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3027f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3037f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3047f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::GET_ACTIVE_CONFIG, data, &reply);
3057f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        return reply.readInt32();
3067f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    }
3077f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza
3087f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    virtual status_t setActiveConfig(const sp<IBinder>& display, int id)
3097f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza    {
3107f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        Parcel data, reply;
3117f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
3127f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeStrongBinder(display);
3137f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        data.writeInt32(id);
3147f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        remote()->transact(BnSurfaceComposer::SET_ACTIVE_CONFIG, data, &reply);
315c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian        return reply.readInt32();
316c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian    }
317d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
31828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t getDisplayColorModes(const sp<IBinder>& display,
31928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t>* outColorModes) {
32028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
32128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
32228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
32328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeInterfaceToken: %d", result);
32428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
32528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
32628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
32728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
32828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to writeStrongBinder: %d", result);
32928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
33028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
33128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_DISPLAY_COLOR_MODES, data, &reply);
33228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
33328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getDisplayColorModes failed to transact: %d", result);
33428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
33528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
33628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = static_cast<status_t>(reply.readInt32());
33728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result == NO_ERROR) {
33828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            size_t numModes = reply.readUint32();
33928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->clear();
34028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            outColorModes->resize(numModes);
34128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            for (size_t i = 0; i < numModes; ++i) {
34228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                outColorModes->replaceAt(static_cast<android_color_mode_t>(reply.readInt32()), i);
34328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
34428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
34528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return result;
34628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
34728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
34828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual android_color_mode_t getActiveColorMode(const sp<IBinder>& display) {
34928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
35028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
35128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
35228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeInterfaceToken: %d", result);
35328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
35428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
35528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
35628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
35728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to writeStrongBinder: %d", result);
35828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
35928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
36028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::GET_ACTIVE_COLOR_MODE, data, &reply);
36128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
36228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("getActiveColorMode failed to transact: %d", result);
36328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return static_cast<android_color_mode_t>(result);
36428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
36528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<android_color_mode_t>(reply.readInt32());
36628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
36728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
36828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    virtual status_t setActiveColorMode(const sp<IBinder>& display,
36928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode) {
37028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        Parcel data, reply;
37128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
37228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
37328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInterfaceToken: %d", result);
37428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
37528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
37628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeStrongBinder(display);
37728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
37828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeStrongBinder: %d", result);
37928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
38028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
38128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = data.writeInt32(colorMode);
38228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
38328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to writeInt32: %d", result);
38428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
38528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
38628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        result = remote()->transact(BnSurfaceComposer::SET_ACTIVE_COLOR_MODE, data, &reply);
38728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        if (result != NO_ERROR) {
38828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            ALOGE("setActiveColorMode failed to transact: %d", result);
38928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
39028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
39128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        return static_cast<status_t>(reply.readInt32());
39228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright    }
39328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright
394d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t clearAnimationFrameStats() {
395d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
396d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
397d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::CLEAR_ANIMATION_FRAME_STATS, data, &reply);
398d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
399d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
400d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
401d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    virtual status_t getAnimationFrameStats(FrameStats* outStats) const {
402d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        Parcel data, reply;
403d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
404d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        remote()->transact(BnSurfaceComposer::GET_ANIMATION_FRAME_STATS, data, &reply);
405d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        reply.read(*outStats);
406d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        return reply.readInt32();
407d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    }
408c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza
409c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    virtual status_t getHdrCapabilities(const sp<IBinder>& display,
410c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities* outCapabilities) const {
411c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        Parcel data, reply;
412c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
413c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        status_t result = data.writeStrongBinder(display);
414c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
415c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to writeStrongBinder: %d", result);
416c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
417c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
418c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = remote()->transact(BnSurfaceComposer::GET_HDR_CAPABILITIES,
419c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                data, &reply);
420c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result != NO_ERROR) {
421c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            ALOGE("getHdrCapabilities failed to transact: %d", result);
422c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return result;
423c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
424c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        result = reply.readInt32();
425c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        if (result == NO_ERROR) {
426e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian            result = reply.read(*outCapabilities);
427c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
428c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        return result;
429c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza    }
430c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
431c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t enableVSyncInjections(bool enable) {
432c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
433c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
434c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
435c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeInterfaceToken: %d", result);
436c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
437c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
438c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeBool(enable);
439c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
440c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to writeBool: %d", result);
441c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
442c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
443c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::ENABLE_VSYNC_INJECTIONS,
444c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                data, &reply, TF_ONE_WAY);
445c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
446c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("enableVSyncInjections failed to transact: %d", result);
447c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
448c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
449c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
450c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
451c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
452c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    virtual status_t injectVSync(nsecs_t when) {
453c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        Parcel data, reply;
454c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        status_t result = data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor());
455c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
456c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInterfaceToken: %d", result);
457c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
458c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
459c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = data.writeInt64(when);
460c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
461c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to writeInt64: %d", result);
462c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
463c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
464c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        result = remote()->transact(BnSurfaceComposer::INJECT_VSYNC, data, &reply, TF_ONE_WAY);
465c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        if (result != NO_ERROR) {
466c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            ALOGE("injectVSync failed to transact: %d", result);
467c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return result;
468c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
469c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        return result;
470c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju    }
471c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
474d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// Out-of-line virtual method definition to trigger vtable emission in this
475d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza// translation unit (see clang warning -Wweak-vtables)
476d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan StozaBpSurfaceComposer::~BpSurfaceComposer() {}
477d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(SurfaceComposer, "android.ui.ISurfaceComposer");
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BnSurfaceComposer::onTransact(
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch(code) {
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case CREATE_CONNECTION: {
48783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4882ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            sp<IBinder> b = IInterface::asBinder(createConnection());
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeStrongBinder(b);
4906c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
4916c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
4921db73f66624e7d151710483dd58e03eed672f064Robert Carr        case CREATE_SCOPED_CONNECTION: {
4931db73f66624e7d151710483dd58e03eed672f064Robert Carr            CHECK_INTERFACE(ISurfaceComposer, data, reply);
4941db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IGraphicBufferProducer> bufferProducer =
4951db73f66624e7d151710483dd58e03eed672f064Robert Carr                interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
4961db73f66624e7d151710483dd58e03eed672f064Robert Carr            sp<IBinder> b = IInterface::asBinder(createScopedConnection(bufferProducer));
4971db73f66624e7d151710483dd58e03eed672f064Robert Carr            reply->writeStrongBinder(b);
4981db73f66624e7d151710483dd58e03eed672f064Robert Carr            return NO_ERROR;
4991db73f66624e7d151710483dd58e03eed672f064Robert Carr        }
500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        case SET_TRANSACTION_STATE: {
50183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
502d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
503d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            size_t count = data.readUint32();
5048afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5058afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5068afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            ComposerState s;
508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            Vector<ComposerState> state;
509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            state.setCapacity(count);
510d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5118afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (s.read(data) == BAD_VALUE) {
5128afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5138afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
514698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian                state.add(s);
515698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian            }
516d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
517d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            count = data.readUint32();
5188afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            if (count > data.dataSize()) {
5198afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                return BAD_VALUE;
5208afa1c4ab86d724feb7716e153b7835385534590Michael Lentine            }
5218b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            DisplayState d;
5228b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            Vector<DisplayState> displays;
5238b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            displays.setCapacity(count);
524d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            for (size_t i = 0; i < count; i++) {
5258afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                if (d.read(data) == BAD_VALUE) {
5268afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                    return BAD_VALUE;
5278afa1c4ab86d724feb7716e153b7835385534590Michael Lentine                }
5288b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian                displays.add(d);
5298b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian            }
530d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza
531d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t stateFlags = data.readUint32();
532d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            setTransactionState(state, displays, stateFlags);
5336c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5346c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case BOOT_FINISHED: {
53683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            bootFinished();
5386c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5396c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5402a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian        case CAPTURE_SCREEN: {
5412a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5422a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IBinder> display = data.readStrongBinder();
5432a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            sp<IGraphicBufferProducer> producer =
5442a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
54560d6922a011fe18c111b8d30fb6ef1f655b6b15ePablo Ceballos            Rect sourceCrop(Rect::EMPTY_RECT);
546c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza            data.read(sourceCrop);
547d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqWidth = data.readUint32();
548d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            uint32_t reqHeight = data.readUint32();
549ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t minLayerZ = data.readInt32();
550ae0608381b2b4699218febd6d45ad9d307544d55Robert Carr            int32_t maxLayerZ = data.readInt32();
551c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza            bool useIdentityTransform = static_cast<bool>(data.readInt32());
552d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza            int32_t rotation = data.readInt32();
553c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza
5542a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            status_t res = captureScreen(display, producer,
555c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza                    sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
556c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    useIdentityTransform,
557c3ebe66b49cfba035e1fd0e160a13db38eb81b0eRiley Andrews                    static_cast<ISurfaceComposer::Rotation>(rotation));
5582a9fc493dfdba67108e4335bb1fe931bc1e2a025Mathias Agopian            reply->writeInt32(res);
5596c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5606c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
561134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        case AUTHENTICATE_SURFACE: {
562134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5632adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            sp<IGraphicBufferProducer> bufferProducer =
5642adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden                    interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
5652adaf04fab35cf47c824d74d901b54094e01ccd3Andy McFadden            int32_t result = authenticateSurfaceTexture(bufferProducer) ? 1 : 0;
566134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            reply->writeInt32(result);
5676c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
5686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
5696b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        case GET_SUPPORTED_FRAME_TIMESTAMPS: {
5706b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5716b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<FrameEvent> supportedTimestamps;
5726b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t result = getSupportedFrameTimestamps(&supportedTimestamps);
5736b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            status_t err = reply->writeInt32(result);
5746b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (err != NO_ERROR) {
5756b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return err;
5766b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
5776b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            if (result != NO_ERROR) {
5786b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                return result;
5796b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
5806b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson
5816b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            std::vector<int32_t> supported;
5826b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            supported.reserve(supportedTimestamps.size());
5836b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            for (FrameEvent s : supportedTimestamps) {
5846b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson                supported.push_back(static_cast<int32_t>(s));
5856b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            }
5866b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson            return reply->writeInt32Vector(supported);
5876b376713907086c9642e7b7e66e51ddfa531b003Brian Anderson        }
588d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        case CREATE_DISPLAY_EVENT_CONNECTION: {
589d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5903e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi            sp<IDisplayEventConnection> connection(createDisplayEventConnection(
5913e30d2f7c5d26f3a924c7a67ffe3d0ee9ac3c7c1Jorim Jaggi                    static_cast<ISurfaceComposer::VsyncSource>(data.readInt32())));
5922ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen            reply->writeStrongBinder(IInterface::asBinder(connection));
593d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            return NO_ERROR;
5946c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
595e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case CREATE_DISPLAY: {
596e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
5978dfa92fef9759a881e96ee58d59875d35023aab9Andy McFadden            String8 displayName = data.readString8();
598dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            bool secure = bool(data.readInt32());
599dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis            sp<IBinder> display(createDisplay(displayName, secure));
600e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
601e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6026c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6036c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        case DESTROY_DISPLAY: {
6046c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6056c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            sp<IBinder> display = data.readStrongBinder();
6066c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            destroyDisplay(display);
6076c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6086c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
609e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian        case GET_BUILT_IN_DISPLAY: {
610e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
611e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            int32_t id = data.readInt32();
612e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            sp<IBinder> display(getBuiltInDisplay(id));
613e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            reply->writeStrongBinder(display);
614e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian            return NO_ERROR;
6156c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
6167f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_DISPLAY_CONFIGS: {
6177f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6187f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            Vector<DisplayInfo> configs;
6197f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
6207f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = getDisplayConfigs(display, &configs);
6217f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(result);
6227f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            if (result == NO_ERROR) {
623d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stoza                reply->writeUint32(static_cast<uint32_t>(configs.size()));
6247f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                for (size_t c = 0; c < configs.size(); ++c) {
6257f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                    memcpy(reply->writeInplace(sizeof(DisplayInfo)),
6267f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                            &configs[c], sizeof(DisplayInfo));
6277f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza                }
6287f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            }
6297f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
6307f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
63167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        case GET_DISPLAY_STATS: {
63267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            CHECK_INTERFACE(ISurfaceComposer, data, reply);
63367d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            DisplayStatInfo stats;
63467d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            sp<IBinder> display = data.readStrongBinder();
63567d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            status_t result = getDisplayStats(display, &stats);
63667d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            reply->writeInt32(result);
63767d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            if (result == NO_ERROR) {
63867d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                memcpy(reply->writeInplace(sizeof(DisplayStatInfo)),
63967d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar                        &stats, sizeof(DisplayStatInfo));
64067d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            }
64167d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar            return NO_ERROR;
64267d8bd66aaf04805cb8f2616ba964141b865e3b9Lajos Molnar        }
6437f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case GET_ACTIVE_CONFIG: {
6447f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6457f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            sp<IBinder> display = data.readStrongBinder();
6467f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = getActiveConfig(display);
6477f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            reply->writeInt32(id);
6487f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            return NO_ERROR;
6497f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        }
6507f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza        case SET_ACTIVE_CONFIG: {
651c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            CHECK_INTERFACE(ISurfaceComposer, data, reply);
6529d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown            sp<IBinder> display = data.readStrongBinder();
6537f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            int id = data.readInt32();
6547f7da32569f8e0b3d383a40b95f8ac1d55afd801Dan Stoza            status_t result = setActiveConfig(display, id);
655c666cae2d5995097ec49a87e375e2afdd92802b7Mathias Agopian            reply->writeInt32(result);
6566c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall            return NO_ERROR;
6576c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
65828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_DISPLAY_COLOR_MODES: {
65928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
66028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            Vector<android_color_mode_t> colorModes;
66128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
66228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
66328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
66428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getDisplayColorModes failed to readStrongBinder: %d", result);
66528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
66628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
66728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = getDisplayColorModes(display, &colorModes);
66828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            reply->writeInt32(result);
66928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result == NO_ERROR) {
67028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                reply->writeUint32(static_cast<uint32_t>(colorModes.size()));
67128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                for (size_t i = 0; i < colorModes.size(); ++i) {
67228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    reply->writeInt32(colorModes[i]);
67328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                }
67428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
67528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return NO_ERROR;
67628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
67728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case GET_ACTIVE_COLOR_MODE: {
67828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
67928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
68028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
68128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
68228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
68328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
68428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
68528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            android_color_mode_t colorMode = getActiveColorMode(display);
68628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(static_cast<int32_t>(colorMode));
68728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
68828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
68928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        case SET_ACTIVE_COLOR_MODE: {
69028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            CHECK_INTERFACE(ISurfaceComposer, data, reply);
69128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            sp<IBinder> display = nullptr;
69228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            status_t result = data.readStrongBinder(&display);
69328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
69428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("getActiveColorMode failed to readStrongBinder: %d", result);
69528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
69628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
69728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            int32_t colorModeInt = 0;
69828f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = data.readInt32(&colorModeInt);
69928f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            if (result != NO_ERROR) {
70028f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                ALOGE("setActiveColorMode failed to readInt32: %d", result);
70128f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                return result;
70228f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            }
70328f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = setActiveColorMode(display,
70428f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright                    static_cast<android_color_mode_t>(colorModeInt));
70528f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            result = reply->writeInt32(result);
70628f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright            return result;
70728f24d0ab481bd9c6fd5618414fee694e837c5c6Michael Wright        }
708d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case CLEAR_ANIMATION_FRAME_STATS: {
709d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
710d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = clearAnimationFrameStats();
711d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
712d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
713d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
714d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        case GET_ANIMATION_FRAME_STATS: {
715d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            CHECK_INTERFACE(ISurfaceComposer, data, reply);
716d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            FrameStats stats;
717d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            status_t result = getAnimationFrameStats(&stats);
718d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->write(stats);
719d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            reply->writeInt32(result);
720d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav            return NO_ERROR;
721d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav        }
7222c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        case SET_POWER_MODE: {
7232c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            CHECK_INTERFACE(ISurfaceComposer, data, reply);
7242c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            sp<IBinder> display = data.readStrongBinder();
7252c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            int32_t mode = data.readInt32();
7262c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            setPowerMode(display, mode);
7272c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani            return NO_ERROR;
7282c9b11f0291210c9b9513a1a0cce6afebd361b3bPrashant Malani        }
729c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        case GET_HDR_CAPABILITIES: {
730c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            CHECK_INTERFACE(ISurfaceComposer, data, reply);
731c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            sp<IBinder> display = nullptr;
732c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            status_t result = data.readStrongBinder(&display);
733c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result != NO_ERROR) {
734c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                ALOGE("getHdrCapabilities failed to readStrongBinder: %d",
735c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                        result);
736c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza                return result;
737c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
738c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            HdrCapabilities capabilities;
739c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            result = getHdrCapabilities(display, &capabilities);
740c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            reply->writeInt32(result);
741c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            if (result == NO_ERROR) {
742e1f5e6fd7ad07778fa4381059852a94567d77dfcMathias Agopian                reply->write(capabilities);
743c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            }
744c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza            return NO_ERROR;
745c4f471e75a8ec64ec34e3f2944a5a756215d0becDan Stoza        }
746c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case ENABLE_VSYNC_INJECTIONS: {
747c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
748c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            bool enable = false;
749c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readBool(&enable);
750c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
751c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readBool: %d", result);
752c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
753c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
754c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return enableVSyncInjections(enable);
755c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
756c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        case INJECT_VSYNC: {
757c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            CHECK_INTERFACE(ISurfaceComposer, data, reply);
758c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            int64_t when = 0;
759c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            status_t result = data.readInt64(&when);
760c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            if (result != NO_ERROR) {
761c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                ALOGE("enableVSyncInjections failed to readInt64: %d", result);
762c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju                return result;
763c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            }
764c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju            return injectVSync(when);
765c1ba5c4649554e744844b07cfe402b42fbe12ff3Sahil Dhanju        }
7666c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        default: {
76783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian            return BBinder::onTransact(code, data, reply, flags);
7686c913be9ca95fd6b556d056e165a4ba6dc69795bJesse Hall        }
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
775