Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb4eaf62 authored by Yiwei Zhang's avatar Yiwei Zhang
Browse files

Game Driver: add dumpsys interface to GpuService

This change also factored some formats in GpuService.

Bug: 123529932
Test: adb shell dumpsys gpu
Change-Id: I9a89c044cc78a43fa4ff2ce1d389a518679bc6b7
parent 705fad86
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ cc_defaults {
        "frameworks/native/vulkan/include",
    ],
    shared_libs: [
        "libbase",
        "libbinder",
        "libcutils",
        "libgraphicsenv",
@@ -37,6 +38,7 @@ cc_defaults {
        "libvulkan",
    ],
    static_libs: [
        "libserviceutils",
        "libvkjson",
    ],
}
+35 −14
Original line number Diff line number Diff line
@@ -18,8 +18,12 @@

#include "GpuService.h"

#include <android-base/stringprintf.h>
#include <binder/IPCThreadState.h>
#include <binder/IResultReceiver.h>
#include <binder/Parcel.h>
#include <binder/PermissionCache.h>
#include <private/android_filesystem_config.h>
#include <utils/String8.h>
#include <utils/Trace.h>

@@ -27,11 +31,14 @@

namespace android {

using base::StringAppendF;

namespace {
    status_t cmd_help(int out);
    status_t cmd_vkjson(int out, int err);
}
status_t cmdHelp(int out);
status_t cmdVkjson(int out, int err);
} // namespace

const String16 sDump("android.permission.DUMP");

const char* const GpuService::SERVICE_NAME = "gpu";

@@ -66,23 +73,37 @@ status_t GpuService::shellCommand(int /*in*/, int out, int err, std::vector<Stri
        ALOGV("  arg[%zu]: '%s'", i, String8(args[i]).string());

    if (args.size() >= 1) {
        if (args[0] == String16("vkjson"))
            return cmd_vkjson(out, err);
        if (args[0] == String16("help"))
            return cmd_help(out);
        if (args[0] == String16("vkjson")) return cmdVkjson(out, err);
        if (args[0] == String16("help")) return cmdHelp(out);
    }
    // no command, or unrecognized command
    cmd_help(err);
    cmdHelp(err);
    return BAD_VALUE;
}

status_t GpuService::doDump(int fd, const Vector<String16>& /*args*/, bool /*asProto*/) {
    std::string result;

    IPCThreadState* ipc = IPCThreadState::self();
    const int pid = ipc->getCallingPid();
    const int uid = ipc->getCallingUid();

    if ((uid != AID_SHELL) && !PermissionCache::checkPermission(sDump, pid, uid)) {
        StringAppendF(&result, "Permission Denial: can't dump gpu from pid=%d, uid=%d\n", pid, uid);
    } else {
        result.append("Hello world from dumpsys gpu.\n");
    }

    write(fd, result.c_str(), result.size());
    return NO_ERROR;
}

namespace {

status_t cmd_help(int out) {
status_t cmdHelp(int out) {
    FILE* outs = fdopen(out, "w");
    if (!outs) {
        ALOGE("vkjson: failed to create out stream: %s (%d)", strerror(errno),
            errno);
        ALOGE("vkjson: failed to create out stream: %s (%d)", strerror(errno), errno);
        return BAD_VALUE;
    }
    fprintf(outs,
@@ -98,7 +119,7 @@ void vkjsonPrint(FILE* out) {
    fputc('\n', out);
}

status_t cmd_vkjson(int out, int /*err*/) {
status_t cmdVkjson(int out, int /*err*/) {
    FILE* outs = fdopen(out, "w");
    if (!outs) {
        int errnum = errno;
+27 −2
Original line number Diff line number Diff line
@@ -20,13 +20,14 @@
#include <binder/IInterface.h>
#include <cutils/compiler.h>
#include <graphicsenv/IGpuService.h>
#include <serviceutils/PriorityDumper.h>

#include <mutex>
#include <vector>

namespace android {

class GpuService : public BnGpuService {
class GpuService : public BnGpuService, public PriorityDumper {
public:
    static const char* const SERVICE_NAME ANDROID_API;

@@ -36,12 +37,36 @@ protected:
    status_t shellCommand(int in, int out, int err, std::vector<String16>& args) override;

private:
    // IGpuService interface
    /*
     * IGpuService interface
     */
    void setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName,
                     uint64_t driverVersionCode, int64_t driverBuildTime,
                     const std::string& appPackageName, GraphicsEnv::Driver driver,
                     bool isDriverLoaded, int64_t driverLoadingTime);

    /*
     * IBinder interface
     */
    status_t dump(int fd, const Vector<String16>& args) override { return priorityDump(fd, args); }

    /*
     * Debugging & dumpsys
     */
    status_t dumpCritical(int fd, const Vector<String16>& /*args*/, bool asProto) override {
        return doDump(fd, Vector<String16>(), asProto);
    }

    status_t dumpAll(int fd, const Vector<String16>& args, bool asProto) override {
        return doDump(fd, args, asProto);
    }

    status_t doDump(int fd, const Vector<String16>& args, bool asProto);

    /*
     * Attributes
     */

    // GpuStats access must be protected by mStateLock
    std::mutex mStateLock;
};