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

Commit c23fcd04 authored by Tom Murphy's avatar Tom Murphy
Browse files

Add engine name to GpuStatsAppInfo

The engine name from VkApplicationInfo is useful for collection metrics
on Vulkan usage. Add it to the collected metrics in GpuStatsAppInfo.

Bug: 330118952
Test: adb shell dumpsys gpu
Test: atest GpuStatsTest
Change-Id: If4096b8a96ed77ddb1d2fd9f48c2b8825b3d0280
parent 150407d3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -96,6 +96,7 @@ status_t GpuStatsAppInfo::writeToParcel(Parcel* parcel) const {
    if ((status = parcel->writeUint64(vulkanDeviceFeaturesEnabled)) != OK) return status;
    if ((status = parcel->writeInt32Vector(vulkanInstanceExtensions)) != OK) return status;
    if ((status = parcel->writeInt32Vector(vulkanDeviceExtensions)) != OK) return status;
    if ((status = parcel->writeUtf8VectorAsUtf16Vector(vulkanEngineNames)) != OK) return status;

    return OK;
}
@@ -118,6 +119,7 @@ status_t GpuStatsAppInfo::readFromParcel(const Parcel* parcel) {
    if ((status = parcel->readUint64(&vulkanDeviceFeaturesEnabled)) != OK) return status;
    if ((status = parcel->readInt32Vector(&vulkanInstanceExtensions)) != OK) return status;
    if ((status = parcel->readInt32Vector(&vulkanDeviceExtensions)) != OK) return status;
    if ((status = parcel->readUtf8VectorFromUtf16Vector(&vulkanEngineNames)) != OK) return status;

    return OK;
}
@@ -161,6 +163,11 @@ std::string GpuStatsAppInfo::toString() const {
        StringAppendF(&result, " 0x%x", extension);
    }
    result.append("\n");
    result.append("vulkanEngineNames:");
    for (const std::string& engineName : vulkanEngineNames) {
        StringAppendF(&result, " %s,", engineName.c_str());
    }
    result.append("\n");
    return result;
}

+15 −0
Original line number Diff line number Diff line
@@ -445,6 +445,21 @@ void GraphicsEnv::setVulkanDeviceExtensions(uint32_t enabledExtensionCount,
                        extensionHashes, numStats);
}

void GraphicsEnv::addVulkanEngineName(const char* engineName) {
    ATRACE_CALL();
    if (engineName == nullptr) {
        return;
    }
    std::lock_guard<std::mutex> lock(mStatsLock);
    if (!readyToSendGpuStatsLocked()) return;

    const sp<IGpuService> gpuService = getGpuService();
    if (gpuService) {
        gpuService->addVulkanEngineName(mGpuStats.appPackageName, mGpuStats.driverVersionCode,
                                        engineName);
    }
}

bool GraphicsEnv::readyToSendGpuStatsLocked() {
    // Only send stats for processes having at least one activity launched and that process doesn't
    // skip the GraphicsEnvironment setup.
+28 −0
Original line number Diff line number Diff line
@@ -77,6 +77,19 @@ public:
                           IBinder::FLAG_ONEWAY);
    }

    void addVulkanEngineName(const std::string& appPackageName, const uint64_t driverVersionCode,
                             const char* engineName) override {
        Parcel data, reply;
        data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());

        data.writeUtf8AsUtf16(appPackageName);
        data.writeUint64(driverVersionCode);
        data.writeCString(engineName);

        remote()->transact(BnGpuService::ADD_VULKAN_ENGINE_NAME, data, &reply,
                           IBinder::FLAG_ONEWAY);
    }

    void setUpdatableDriverPath(const std::string& driverPath) override {
        Parcel data, reply;
        data.writeInterfaceToken(IGpuService::getInterfaceDescriptor());
@@ -197,6 +210,21 @@ status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, Parcel* rep

            return OK;
        }
        case ADD_VULKAN_ENGINE_NAME: {
            CHECK_INTERFACE(IGpuService, data, reply);

            std::string appPackageName;
            if ((status = data.readUtf8FromUtf16(&appPackageName)) != OK) return status;

            uint64_t driverVersionCode;
            if ((status = data.readUint64(&driverVersionCode)) != OK) return status;

            const char* engineName;
            if ((engineName = data.readCString()) == nullptr) return BAD_VALUE;

            addVulkanEngineName(appPackageName, driverVersionCode, engineName);
            return OK;
        }
        case SET_UPDATABLE_DRIVER_PATH: {
            CHECK_INTERFACE(IGpuService, data, reply);

+5 −0
Original line number Diff line number Diff line
@@ -60,6 +60,10 @@ class GpuStatsAppInfo : public Parcelable {
public:
    // This limits the worst case number of extensions to be tracked.
    static const uint32_t MAX_NUM_EXTENSIONS = 100;
    // Max number of vulkan engine names for a single GpuStatsAppInfo
    static const uint32_t MAX_VULKAN_ENGINE_NAMES = 16;
    // Max length of a vulkan engine name string
    static const size_t MAX_VULKAN_ENGINE_NAME_LENGTH = 50;

    GpuStatsAppInfo() = default;
    GpuStatsAppInfo(const GpuStatsAppInfo&) = default;
@@ -84,6 +88,7 @@ public:
    uint64_t vulkanDeviceFeaturesEnabled = 0;
    std::vector<int32_t> vulkanInstanceExtensions = {};
    std::vector<int32_t> vulkanDeviceExtensions = {};
    std::vector<std::string> vulkanEngineNames = {};

    std::chrono::time_point<std::chrono::system_clock> lastAccessTime;
};
+2 −0
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ public:
    // Set which device extensions are enabled for the app.
    void setVulkanDeviceExtensions(uint32_t enabledExtensionCount,
                                   const char* const* ppEnabledExtensionNames);
    // Add the engine name passed in VkApplicationInfo during CreateInstance
    void addVulkanEngineName(const char* engineName);

    /*
     * Api for Vk/GL layer injection.  Presently, drivers enable certain
Loading