diff options
Diffstat (limited to 'services/gpuservice/GpuService.cpp')
| -rw-r--r-- | services/gpuservice/GpuService.cpp | 161 |
1 files changed, 111 insertions, 50 deletions
diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index 150896cf91..8accf9d450 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -14,87 +14,136 @@ * limitations under the License. */ +#define ATRACE_TAG ATRACE_TAG_GRAPHICS + #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 <cutils/properties.h> +#include <private/android_filesystem_config.h> #include <utils/String8.h> +#include <utils/Trace.h> + #include <vkjson.h> +#include "gpustats/GpuStats.h" + namespace android { -class BpGpuService : public BpInterface<IGpuService> { -public: - explicit BpGpuService(const sp<IBinder>& impl) : BpInterface<IGpuService>(impl) {} -}; - -IMPLEMENT_META_INTERFACE(GpuService, "android.ui.IGpuService"); - -status_t BnGpuService::onTransact(uint32_t code, const Parcel& data, - Parcel* reply, uint32_t flags) { - status_t status; - switch (code) { - case SHELL_COMMAND_TRANSACTION: { - int in = data.readFileDescriptor(); - int out = data.readFileDescriptor(); - int err = data.readFileDescriptor(); - std::vector<String16> args; - data.readString16Vector(&args); - sp<IBinder> unusedCallback; - sp<IResultReceiver> resultReceiver; - if ((status = data.readNullableStrongBinder(&unusedCallback)) != OK) - return status; - if ((status = data.readNullableStrongBinder(&resultReceiver)) != OK) - return status; - status = shellCommand(in, out, err, args); - if (resultReceiver != nullptr) - resultReceiver->send(status); - return OK; - } +using base::StringAppendF; - default: - return BBinder::onTransact(code, data, reply, flags); - } +namespace { +status_t cmdHelp(int out); +status_t cmdVkjson(int out, int err); +void dumpGameDriverInfo(std::string* result); +} // namespace + +const String16 sDump("android.permission.DUMP"); + +const char* const GpuService::SERVICE_NAME = "gpu"; + +GpuService::GpuService() : mGpuStats(std::make_unique<GpuStats>()){}; + +void GpuService::setGpuStats(const std::string& driverPackageName, + const std::string& driverVersionName, uint64_t driverVersionCode, + int64_t driverBuildTime, const std::string& appPackageName, + const int32_t vulkanVersion, GraphicsEnv::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime) { + ATRACE_CALL(); + + mGpuStats->insert(driverPackageName, driverVersionName, driverVersionCode, driverBuildTime, + appPackageName, vulkanVersion, driver, isDriverLoaded, driverLoadingTime); } -namespace { - status_t cmd_help(int out); - status_t cmd_vkjson(int out, int err); +status_t GpuService::getGpuStatsGlobalInfo(std::vector<GpuStatsGlobalInfo>* outStats) const { + ATRACE_CALL(); + + mGpuStats->pullGlobalStats(outStats); + + return OK; } -const char* const GpuService::SERVICE_NAME = "gpu"; +status_t GpuService::getGpuStatsAppInfo(std::vector<GpuStatsAppInfo>* outStats) const { + ATRACE_CALL(); -GpuService::GpuService() = default; + mGpuStats->pullAppStats(outStats); -status_t GpuService::shellCommand(int /*in*/, int out, int err, - std::vector<String16>& args) { - ALOGV("GpuService::shellCommand"); + return OK; +} + +void GpuService::setCpuVulkanInUse(const std::string& appPackageName, + const uint64_t driverVersionCode) { + ATRACE_CALL(); + + mGpuStats->setCpuVulkanInUse(appPackageName, driverVersionCode); +} + +status_t GpuService::shellCommand(int /*in*/, int out, int err, std::vector<String16>& args) { + ATRACE_CALL(); + + ALOGV("shellCommand"); for (size_t i = 0, n = args.size(); i < n; i++) 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 { + bool dumpAll = true; + size_t index = 0; + size_t numArgs = args.size(); + + if (numArgs) { + if ((index < numArgs) && (args[index] == String16("--gpustats"))) { + index++; + mGpuStats->dump(args, &result); + dumpAll = false; + } + } + + if (dumpAll) { + dumpGameDriverInfo(&result); + result.append("\n"); + + mGpuStats->dump(Vector<String16>(), &result); + result.append("\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, - "GPU Service commands:\n" - " vkjson dump Vulkan properties as JSON\n"); + "GPU Service commands:\n" + " vkjson dump Vulkan properties as JSON\n"); fclose(outs); return NO_ERROR; } @@ -105,7 +154,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; @@ -117,6 +166,18 @@ status_t cmd_vkjson(int out, int /*err*/) { return NO_ERROR; } +void dumpGameDriverInfo(std::string* result) { + if (!result) return; + + char stableGameDriver[PROPERTY_VALUE_MAX] = {}; + property_get("ro.gfx.driver.0", stableGameDriver, "unsupported"); + StringAppendF(result, "Stable Game Driver: %s\n", stableGameDriver); + + char preReleaseGameDriver[PROPERTY_VALUE_MAX] = {}; + property_get("ro.gfx.driver.1", preReleaseGameDriver, "unsupported"); + StringAppendF(result, "Pre-release Game Driver: %s\n", preReleaseGameDriver); +} + } // anonymous namespace } // namespace android |