1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "GpuService"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <graphicsenv/IGpuService.h>
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/IResultReceiver.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
23*38e8c45fSAndroid Build Coastguard Worker
24*38e8c45fSAndroid Build Coastguard Worker namespace android {
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker class BpGpuService : public BpInterface<IGpuService> {
27*38e8c45fSAndroid Build Coastguard Worker public:
BpGpuService(const sp<IBinder> & impl)28*38e8c45fSAndroid Build Coastguard Worker explicit BpGpuService(const sp<IBinder>& impl) : BpInterface<IGpuService>(impl) {}
29*38e8c45fSAndroid Build Coastguard Worker
setGpuStats(const std::string & driverPackageName,const std::string & driverVersionName,uint64_t driverVersionCode,int64_t driverBuildTime,const std::string & appPackageName,const int32_t vulkanVersion,GpuStatsInfo::Driver driver,bool isDriverLoaded,int64_t driverLoadingTime)30*38e8c45fSAndroid Build Coastguard Worker void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName,
31*38e8c45fSAndroid Build Coastguard Worker uint64_t driverVersionCode, int64_t driverBuildTime,
32*38e8c45fSAndroid Build Coastguard Worker const std::string& appPackageName, const int32_t vulkanVersion,
33*38e8c45fSAndroid Build Coastguard Worker GpuStatsInfo::Driver driver, bool isDriverLoaded,
34*38e8c45fSAndroid Build Coastguard Worker int64_t driverLoadingTime) override {
35*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
36*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
37*38e8c45fSAndroid Build Coastguard Worker
38*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(driverPackageName);
39*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(driverVersionName);
40*38e8c45fSAndroid Build Coastguard Worker data.writeUint64(driverVersionCode);
41*38e8c45fSAndroid Build Coastguard Worker data.writeInt64(driverBuildTime);
42*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(appPackageName);
43*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(vulkanVersion);
44*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(static_cast<int32_t>(driver));
45*38e8c45fSAndroid Build Coastguard Worker data.writeBool(isDriverLoaded);
46*38e8c45fSAndroid Build Coastguard Worker data.writeInt64(driverLoadingTime);
47*38e8c45fSAndroid Build Coastguard Worker
48*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::SET_GPU_STATS, data, &reply, IBinder::FLAG_ONEWAY);
49*38e8c45fSAndroid Build Coastguard Worker }
50*38e8c45fSAndroid Build Coastguard Worker
setTargetStats(const std::string & appPackageName,const uint64_t driverVersionCode,const GpuStatsInfo::Stats stats,const uint64_t value)51*38e8c45fSAndroid Build Coastguard Worker void setTargetStats(const std::string& appPackageName, const uint64_t driverVersionCode,
52*38e8c45fSAndroid Build Coastguard Worker const GpuStatsInfo::Stats stats, const uint64_t value) override {
53*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
54*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
55*38e8c45fSAndroid Build Coastguard Worker
56*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(appPackageName);
57*38e8c45fSAndroid Build Coastguard Worker data.writeUint64(driverVersionCode);
58*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(static_cast<int32_t>(stats));
59*38e8c45fSAndroid Build Coastguard Worker data.writeUint64(value);
60*38e8c45fSAndroid Build Coastguard Worker
61*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::SET_TARGET_STATS, data, &reply, IBinder::FLAG_ONEWAY);
62*38e8c45fSAndroid Build Coastguard Worker }
63*38e8c45fSAndroid Build Coastguard Worker
setTargetStatsArray(const std::string & appPackageName,const uint64_t driverVersionCode,const GpuStatsInfo::Stats stats,const uint64_t * values,const uint32_t valueCount)64*38e8c45fSAndroid Build Coastguard Worker void setTargetStatsArray(const std::string& appPackageName, const uint64_t driverVersionCode,
65*38e8c45fSAndroid Build Coastguard Worker const GpuStatsInfo::Stats stats, const uint64_t* values,
66*38e8c45fSAndroid Build Coastguard Worker const uint32_t valueCount) override {
67*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
68*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
69*38e8c45fSAndroid Build Coastguard Worker
70*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(appPackageName);
71*38e8c45fSAndroid Build Coastguard Worker data.writeUint64(driverVersionCode);
72*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(static_cast<int32_t>(stats));
73*38e8c45fSAndroid Build Coastguard Worker data.writeUint32(valueCount);
74*38e8c45fSAndroid Build Coastguard Worker data.write(values, valueCount * sizeof(uint64_t));
75*38e8c45fSAndroid Build Coastguard Worker
76*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::SET_TARGET_STATS_ARRAY, data, &reply,
77*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY);
78*38e8c45fSAndroid Build Coastguard Worker }
79*38e8c45fSAndroid Build Coastguard Worker
addVulkanEngineName(const std::string & appPackageName,const uint64_t driverVersionCode,const char * engineName)80*38e8c45fSAndroid Build Coastguard Worker void addVulkanEngineName(const std::string& appPackageName, const uint64_t driverVersionCode,
81*38e8c45fSAndroid Build Coastguard Worker const char* engineName) override {
82*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
83*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
84*38e8c45fSAndroid Build Coastguard Worker
85*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(appPackageName);
86*38e8c45fSAndroid Build Coastguard Worker data.writeUint64(driverVersionCode);
87*38e8c45fSAndroid Build Coastguard Worker data.writeCString(engineName);
88*38e8c45fSAndroid Build Coastguard Worker
89*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::ADD_VULKAN_ENGINE_NAME, data, &reply,
90*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY);
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker
setUpdatableDriverPath(const std::string & driverPath)93*38e8c45fSAndroid Build Coastguard Worker void setUpdatableDriverPath(const std::string& driverPath) override {
94*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
95*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
96*38e8c45fSAndroid Build Coastguard Worker data.writeUtf8AsUtf16(driverPath);
97*38e8c45fSAndroid Build Coastguard Worker
98*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::SET_UPDATABLE_DRIVER_PATH, data, &reply,
99*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY);
100*38e8c45fSAndroid Build Coastguard Worker }
101*38e8c45fSAndroid Build Coastguard Worker
toggleAngleAsSystemDriver(bool enabled)102*38e8c45fSAndroid Build Coastguard Worker void toggleAngleAsSystemDriver(bool enabled) override {
103*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
104*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
105*38e8c45fSAndroid Build Coastguard Worker data.writeBool(enabled);
106*38e8c45fSAndroid Build Coastguard Worker
107*38e8c45fSAndroid Build Coastguard Worker remote()->transact(BnGpuService::TOGGLE_ANGLE_AS_SYSTEM_DRIVER, data, &reply,
108*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY);
109*38e8c45fSAndroid Build Coastguard Worker }
110*38e8c45fSAndroid Build Coastguard Worker
getUpdatableDriverPath()111*38e8c45fSAndroid Build Coastguard Worker std::string getUpdatableDriverPath() override {
112*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply;
113*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
114*38e8c45fSAndroid Build Coastguard Worker
115*38e8c45fSAndroid Build Coastguard Worker status_t error = remote()->transact(BnGpuService::GET_UPDATABLE_DRIVER_PATH, data, &reply);
116*38e8c45fSAndroid Build Coastguard Worker std::string driverPath;
117*38e8c45fSAndroid Build Coastguard Worker if (error == OK) {
118*38e8c45fSAndroid Build Coastguard Worker error = reply.readUtf8FromUtf16(&driverPath);
119*38e8c45fSAndroid Build Coastguard Worker }
120*38e8c45fSAndroid Build Coastguard Worker return driverPath;
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker };
123*38e8c45fSAndroid Build Coastguard Worker
124*38e8c45fSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(GpuService, "android.graphicsenv.IGpuService");
125*38e8c45fSAndroid Build Coastguard Worker
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)126*38e8c45fSAndroid Build Coastguard Worker status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
127*38e8c45fSAndroid Build Coastguard Worker uint32_t flags) {
128*38e8c45fSAndroid Build Coastguard Worker ALOGV("onTransact code[0x%X]", code);
129*38e8c45fSAndroid Build Coastguard Worker
130*38e8c45fSAndroid Build Coastguard Worker status_t status;
131*38e8c45fSAndroid Build Coastguard Worker switch (code) {
132*38e8c45fSAndroid Build Coastguard Worker case SET_GPU_STATS: {
133*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
134*38e8c45fSAndroid Build Coastguard Worker
135*38e8c45fSAndroid Build Coastguard Worker std::string driverPackageName;
136*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&driverPackageName)) != OK) return status;
137*38e8c45fSAndroid Build Coastguard Worker
138*38e8c45fSAndroid Build Coastguard Worker std::string driverVersionName;
139*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&driverVersionName)) != OK) return status;
140*38e8c45fSAndroid Build Coastguard Worker
141*38e8c45fSAndroid Build Coastguard Worker uint64_t driverVersionCode;
142*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint64(&driverVersionCode)) != OK) return status;
143*38e8c45fSAndroid Build Coastguard Worker
144*38e8c45fSAndroid Build Coastguard Worker int64_t driverBuildTime;
145*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt64(&driverBuildTime)) != OK) return status;
146*38e8c45fSAndroid Build Coastguard Worker
147*38e8c45fSAndroid Build Coastguard Worker std::string appPackageName;
148*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status;
149*38e8c45fSAndroid Build Coastguard Worker
150*38e8c45fSAndroid Build Coastguard Worker int32_t vulkanVersion;
151*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt32(&vulkanVersion)) != OK) return status;
152*38e8c45fSAndroid Build Coastguard Worker
153*38e8c45fSAndroid Build Coastguard Worker int32_t driver;
154*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt32(&driver)) != OK) return status;
155*38e8c45fSAndroid Build Coastguard Worker
156*38e8c45fSAndroid Build Coastguard Worker bool isDriverLoaded;
157*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readBool(&isDriverLoaded)) != OK) return status;
158*38e8c45fSAndroid Build Coastguard Worker
159*38e8c45fSAndroid Build Coastguard Worker int64_t driverLoadingTime;
160*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt64(&driverLoadingTime)) != OK) return status;
161*38e8c45fSAndroid Build Coastguard Worker
162*38e8c45fSAndroid Build Coastguard Worker setGpuStats(driverPackageName, driverVersionName, driverVersionCode, driverBuildTime,
163*38e8c45fSAndroid Build Coastguard Worker appPackageName, vulkanVersion, static_cast<GpuStatsInfo::Driver>(driver),
164*38e8c45fSAndroid Build Coastguard Worker isDriverLoaded, driverLoadingTime);
165*38e8c45fSAndroid Build Coastguard Worker
166*38e8c45fSAndroid Build Coastguard Worker return OK;
167*38e8c45fSAndroid Build Coastguard Worker }
168*38e8c45fSAndroid Build Coastguard Worker case SET_TARGET_STATS: {
169*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
170*38e8c45fSAndroid Build Coastguard Worker
171*38e8c45fSAndroid Build Coastguard Worker std::string appPackageName;
172*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status;
173*38e8c45fSAndroid Build Coastguard Worker
174*38e8c45fSAndroid Build Coastguard Worker uint64_t driverVersionCode;
175*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint64(&driverVersionCode)) != OK) return status;
176*38e8c45fSAndroid Build Coastguard Worker
177*38e8c45fSAndroid Build Coastguard Worker int32_t stats;
178*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt32(&stats)) != OK) return status;
179*38e8c45fSAndroid Build Coastguard Worker
180*38e8c45fSAndroid Build Coastguard Worker uint64_t value;
181*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint64(&value)) != OK) return status;
182*38e8c45fSAndroid Build Coastguard Worker
183*38e8c45fSAndroid Build Coastguard Worker setTargetStats(appPackageName, driverVersionCode,
184*38e8c45fSAndroid Build Coastguard Worker static_cast<GpuStatsInfo::Stats>(stats), value);
185*38e8c45fSAndroid Build Coastguard Worker
186*38e8c45fSAndroid Build Coastguard Worker return OK;
187*38e8c45fSAndroid Build Coastguard Worker }
188*38e8c45fSAndroid Build Coastguard Worker case SET_TARGET_STATS_ARRAY: {
189*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
190*38e8c45fSAndroid Build Coastguard Worker
191*38e8c45fSAndroid Build Coastguard Worker std::string appPackageName;
192*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status;
193*38e8c45fSAndroid Build Coastguard Worker
194*38e8c45fSAndroid Build Coastguard Worker uint64_t driverVersionCode;
195*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint64(&driverVersionCode)) != OK) return status;
196*38e8c45fSAndroid Build Coastguard Worker
197*38e8c45fSAndroid Build Coastguard Worker int32_t stats;
198*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readInt32(&stats)) != OK) return status;
199*38e8c45fSAndroid Build Coastguard Worker
200*38e8c45fSAndroid Build Coastguard Worker uint32_t valueCount;
201*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint32(&valueCount)) != OK) return status;
202*38e8c45fSAndroid Build Coastguard Worker
203*38e8c45fSAndroid Build Coastguard Worker std::vector<uint64_t> values(valueCount);
204*38e8c45fSAndroid Build Coastguard Worker if ((status = data.read(values.data(), valueCount * sizeof(uint64_t))) != OK) {
205*38e8c45fSAndroid Build Coastguard Worker return status;
206*38e8c45fSAndroid Build Coastguard Worker }
207*38e8c45fSAndroid Build Coastguard Worker
208*38e8c45fSAndroid Build Coastguard Worker setTargetStatsArray(appPackageName, driverVersionCode,
209*38e8c45fSAndroid Build Coastguard Worker static_cast<GpuStatsInfo::Stats>(stats), values.data(), valueCount);
210*38e8c45fSAndroid Build Coastguard Worker
211*38e8c45fSAndroid Build Coastguard Worker return OK;
212*38e8c45fSAndroid Build Coastguard Worker }
213*38e8c45fSAndroid Build Coastguard Worker case ADD_VULKAN_ENGINE_NAME: {
214*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
215*38e8c45fSAndroid Build Coastguard Worker
216*38e8c45fSAndroid Build Coastguard Worker std::string appPackageName;
217*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status;
218*38e8c45fSAndroid Build Coastguard Worker
219*38e8c45fSAndroid Build Coastguard Worker uint64_t driverVersionCode;
220*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUint64(&driverVersionCode)) != OK) return status;
221*38e8c45fSAndroid Build Coastguard Worker
222*38e8c45fSAndroid Build Coastguard Worker const char* engineName;
223*38e8c45fSAndroid Build Coastguard Worker if ((engineName = data.readCString()) == nullptr) return BAD_VALUE;
224*38e8c45fSAndroid Build Coastguard Worker
225*38e8c45fSAndroid Build Coastguard Worker addVulkanEngineName(appPackageName, driverVersionCode, engineName);
226*38e8c45fSAndroid Build Coastguard Worker return OK;
227*38e8c45fSAndroid Build Coastguard Worker }
228*38e8c45fSAndroid Build Coastguard Worker case SET_UPDATABLE_DRIVER_PATH: {
229*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
230*38e8c45fSAndroid Build Coastguard Worker
231*38e8c45fSAndroid Build Coastguard Worker std::string driverPath;
232*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readUtf8FromUtf16(&driverPath)) != OK) return status;
233*38e8c45fSAndroid Build Coastguard Worker
234*38e8c45fSAndroid Build Coastguard Worker setUpdatableDriverPath(driverPath);
235*38e8c45fSAndroid Build Coastguard Worker return OK;
236*38e8c45fSAndroid Build Coastguard Worker }
237*38e8c45fSAndroid Build Coastguard Worker case GET_UPDATABLE_DRIVER_PATH: {
238*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
239*38e8c45fSAndroid Build Coastguard Worker
240*38e8c45fSAndroid Build Coastguard Worker std::string driverPath = getUpdatableDriverPath();
241*38e8c45fSAndroid Build Coastguard Worker return reply->writeUtf8AsUtf16(driverPath);
242*38e8c45fSAndroid Build Coastguard Worker }
243*38e8c45fSAndroid Build Coastguard Worker case SHELL_COMMAND_TRANSACTION: {
244*38e8c45fSAndroid Build Coastguard Worker int in = dup(data.readFileDescriptor());
245*38e8c45fSAndroid Build Coastguard Worker int out = dup(data.readFileDescriptor());
246*38e8c45fSAndroid Build Coastguard Worker int err = dup(data.readFileDescriptor());
247*38e8c45fSAndroid Build Coastguard Worker
248*38e8c45fSAndroid Build Coastguard Worker std::vector<String16> args;
249*38e8c45fSAndroid Build Coastguard Worker data.readString16Vector(&args);
250*38e8c45fSAndroid Build Coastguard Worker
251*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> unusedCallback;
252*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readNullableStrongBinder(&unusedCallback)) != OK) return status;
253*38e8c45fSAndroid Build Coastguard Worker
254*38e8c45fSAndroid Build Coastguard Worker sp<IResultReceiver> resultReceiver;
255*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readNullableStrongBinder(&resultReceiver)) != OK) return status;
256*38e8c45fSAndroid Build Coastguard Worker
257*38e8c45fSAndroid Build Coastguard Worker status = shellCommand(in, out, err, args);
258*38e8c45fSAndroid Build Coastguard Worker if (resultReceiver != nullptr) resultReceiver->send(status);
259*38e8c45fSAndroid Build Coastguard Worker ::close(in);
260*38e8c45fSAndroid Build Coastguard Worker ::close(out);
261*38e8c45fSAndroid Build Coastguard Worker ::close(err);
262*38e8c45fSAndroid Build Coastguard Worker
263*38e8c45fSAndroid Build Coastguard Worker return OK;
264*38e8c45fSAndroid Build Coastguard Worker }
265*38e8c45fSAndroid Build Coastguard Worker case TOGGLE_ANGLE_AS_SYSTEM_DRIVER: {
266*38e8c45fSAndroid Build Coastguard Worker CHECK_INTERFACE(IGpuService, data, reply);
267*38e8c45fSAndroid Build Coastguard Worker
268*38e8c45fSAndroid Build Coastguard Worker bool enableAngleAsSystemDriver;
269*38e8c45fSAndroid Build Coastguard Worker if ((status = data.readBool(&enableAngleAsSystemDriver)) != OK) return status;
270*38e8c45fSAndroid Build Coastguard Worker
271*38e8c45fSAndroid Build Coastguard Worker toggleAngleAsSystemDriver(enableAngleAsSystemDriver);
272*38e8c45fSAndroid Build Coastguard Worker return OK;
273*38e8c45fSAndroid Build Coastguard Worker }
274*38e8c45fSAndroid Build Coastguard Worker default:
275*38e8c45fSAndroid Build Coastguard Worker return BBinder::onTransact(code, data, reply, flags);
276*38e8c45fSAndroid Build Coastguard Worker }
277*38e8c45fSAndroid Build Coastguard Worker }
278*38e8c45fSAndroid Build Coastguard Worker
279*38e8c45fSAndroid Build Coastguard Worker } // namespace android
280