xref: /aosp_15_r20/frameworks/native/libs/graphicsenv/IGpuService.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
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