blob: a1974264cdcc4fb5d0585e6b700feef3168b5e22 [file] [log] [blame]
Mathias Agopiand0566bc2011-11-17 17:49:17 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mathias Agopiand0566bc2011-11-17 17:49:17 -080017#include <gui/IDisplayEventConnection.h>
Mathias Agopian801ea092017-03-06 15:05:04 -080018
19#include <private/gui/BitTube.h>
Mathias Agopiand0566bc2011-11-17 17:49:17 -080020
Dan Stozaa5f61dd2017-03-30 16:09:13 -070021#include <binder/Parcel.h>
22
Mathias Agopiand0566bc2011-11-17 17:49:17 -080023namespace android {
Mathias Agopiand0566bc2011-11-17 17:49:17 -080024
Dan Stoza6b698e42017-04-03 13:09:08 -070025enum {
26 STEAL_RECEIVE_CHANNEL = IBinder::FIRST_CALL_TRANSACTION,
27 SET_VSYNC_RATE,
28 REQUEST_NEXT_VSYNC
29};
Mathias Agopiand0566bc2011-11-17 17:49:17 -080030
Dan Stozaa5f61dd2017-03-30 16:09:13 -070031class BpDisplayEventConnection : public BpInterface<IDisplayEventConnection> {
Mathias Agopiand0566bc2011-11-17 17:49:17 -080032public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070033 explicit BpDisplayEventConnection(const sp<IBinder>& impl)
Dan Stozaa5f61dd2017-03-30 16:09:13 -070034 : BpInterface<IDisplayEventConnection>(impl) {}
Mathias Agopiand0566bc2011-11-17 17:49:17 -080035
Dan Stozae1c599b2017-03-30 16:37:19 -070036 ~BpDisplayEventConnection() override;
Dan Stozad723bd72014-11-18 10:24:03 -080037
Dan Stoza6b698e42017-04-03 13:09:08 -070038 status_t stealReceiveChannel(gui::BitTube* outChannel) override {
Mathias Agopiand0566bc2011-11-17 17:49:17 -080039 Parcel data, reply;
40 data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
Dan Stoza6b698e42017-04-03 13:09:08 -070041 remote()->transact(STEAL_RECEIVE_CHANNEL, data, &reply);
42 outChannel->readFromParcel(&reply);
Dan Stozae1c599b2017-03-30 16:37:19 -070043 return NO_ERROR;
Mathias Agopiand0566bc2011-11-17 17:49:17 -080044 }
Mathias Agopian478ae5e2011-12-06 17:22:19 -080045
Dan Stozae1c599b2017-03-30 16:37:19 -070046 status_t setVsyncRate(uint32_t count) override {
Mathias Agopian478ae5e2011-12-06 17:22:19 -080047 Parcel data, reply;
48 data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
Dan Stozad723bd72014-11-18 10:24:03 -080049 data.writeUint32(count);
Mathias Agopian478ae5e2011-12-06 17:22:19 -080050 remote()->transact(SET_VSYNC_RATE, data, &reply);
Dan Stozae1c599b2017-03-30 16:37:19 -070051 return NO_ERROR;
Mathias Agopian478ae5e2011-12-06 17:22:19 -080052 }
53
Dan Stozae1c599b2017-03-30 16:37:19 -070054 void requestNextVsync() override {
Mathias Agopian478ae5e2011-12-06 17:22:19 -080055 Parcel data, reply;
56 data.writeInterfaceToken(IDisplayEventConnection::getInterfaceDescriptor());
57 remote()->transact(REQUEST_NEXT_VSYNC, data, &reply, IBinder::FLAG_ONEWAY);
58 }
Mathias Agopiand0566bc2011-11-17 17:49:17 -080059};
60
Dan Stozaa5f61dd2017-03-30 16:09:13 -070061// Out-of-line virtual method definition to trigger vtable emission in this translation unit (see
62// clang warning -Wweak-vtables)
Dan Stozad723bd72014-11-18 10:24:03 -080063BpDisplayEventConnection::~BpDisplayEventConnection() {}
64
Mathias Agopiand0566bc2011-11-17 17:49:17 -080065IMPLEMENT_META_INTERFACE(DisplayEventConnection, "android.gui.DisplayEventConnection");
66
Dan Stozaa5f61dd2017-03-30 16:09:13 -070067status_t BnDisplayEventConnection::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
68 uint32_t flags) {
69 switch (code) {
Dan Stoza6b698e42017-04-03 13:09:08 -070070 case STEAL_RECEIVE_CHANNEL: {
Mathias Agopiand0566bc2011-11-17 17:49:17 -080071 CHECK_INTERFACE(IDisplayEventConnection, data, reply);
Dan Stoza6b698e42017-04-03 13:09:08 -070072 gui::BitTube channel;
73 stealReceiveChannel(&channel);
74 channel.writeToParcel(reply);
Mathias Agopiand0566bc2011-11-17 17:49:17 -080075 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -080076 }
Mathias Agopian478ae5e2011-12-06 17:22:19 -080077 case SET_VSYNC_RATE: {
78 CHECK_INTERFACE(IDisplayEventConnection, data, reply);
Dan Stozad723bd72014-11-18 10:24:03 -080079 setVsyncRate(data.readUint32());
Mathias Agopian478ae5e2011-12-06 17:22:19 -080080 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -080081 }
Mathias Agopian478ae5e2011-12-06 17:22:19 -080082 case REQUEST_NEXT_VSYNC: {
83 CHECK_INTERFACE(IDisplayEventConnection, data, reply);
84 requestNextVsync();
85 return NO_ERROR;
Dan Stozad723bd72014-11-18 10:24:03 -080086 }
Mathias Agopiand0566bc2011-11-17 17:49:17 -080087 }
88 return BBinder::onTransact(code, data, reply, flags);
89}
90
Dan Stozaa5f61dd2017-03-30 16:09:13 -070091} // namespace android