From c5aa738f100823f3c9f837eddebf6508945d42e7 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Wed, 19 Feb 2020 15:44:17 -0800 Subject: GPU Memory: install gpu_mem.o and integrate libgpumem This change integrates libgpumem into gpuservice. gpu_mem.o c program is required in the blueprint so that gpu_mem.o will be compiled and installed at /system/etc/bpf/. This change also adds a proper CleanSpec.mk for gpu_mem.o Bug: 154524735 Test: adb shell dumpsys gpu --gpumem Change-Id: Iad09d061691ffd4cf0fc4bde63cb6f0ae459aa27 Merged-In: Iad09d061691ffd4cf0fc4bde63cb6f0ae459aa27 --- services/gpuservice/Android.bp | 5 ++++ services/gpuservice/CleanSpec.mk | 52 ++++++++++++++++++++++++++++++++++++++ services/gpuservice/GpuService.cpp | 16 +++++++++--- services/gpuservice/GpuService.h | 2 ++ 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 services/gpuservice/CleanSpec.mk diff --git a/services/gpuservice/Android.bp b/services/gpuservice/Android.bp index 4da6db3438..a75d6db11b 100644 --- a/services/gpuservice/Android.bp +++ b/services/gpuservice/Android.bp @@ -21,6 +21,7 @@ cc_defaults { "libbinder", "libcutils", "libgfxstats", + "libgpumem", "libgraphicsenv", "liblog", "libutils", @@ -85,6 +86,10 @@ cc_binary { name: "gpuservice", defaults: ["libgpuservice_binary"], init_rc: ["gpuservice.rc"], + required: [ + "bpfloader", + "gpu_mem.o", + ], srcs: [":gpuservice_binary_sources"], shared_libs: [ "libgpuservice", diff --git a/services/gpuservice/CleanSpec.mk b/services/gpuservice/CleanSpec.mk new file mode 100644 index 0000000000..482fc6dfc3 --- /dev/null +++ b/services/gpuservice/CleanSpec.mk @@ -0,0 +1,52 @@ +# Copyright 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# If you don't need to do a full clean build but would like to touch +# a file or delete some intermediate files, add a clean step to the end +# of the list. These steps will only be run once, if they haven't been +# run before. +# +# E.g.: +# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) +# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) +# +# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with +# files that are missing or have been moved. +# +# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. +# Use $(OUT_DIR) to refer to the "out" directory. +# +# If you need to re-do something that's already mentioned, just copy +# the command and add it to the bottom of the list. E.g., if a change +# that you made last week required touching a file and a change you +# made today requires touching the same file, just copy the old +# touch step and add it to the end of the list. +# +# ************************************************ +# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST +# ************************************************ + +# For example: +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates) +#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates) +#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f) +#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*) + +# Remove gpu_mem.o +$(call add-clean-step, rm -rf $(OUT_DIR)/soong/.intermediates/frameworks/native/services/gpuservice/bpf) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/FAKE/gpu_mem.o_intermediates) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/ETC/gpu_mem.o_gpu_mem.o_intermediates) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/bpf/gpu_mem.o) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/fake_packages/gpu_mem.o-timestamp) diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index 81b0a46e0c..0ca8e5d2e3 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -24,11 +24,11 @@ #include #include #include +#include #include #include #include #include - #include namespace android { @@ -45,7 +45,10 @@ const String16 sDump("android.permission.DUMP"); const char* const GpuService::SERVICE_NAME = "gpu"; -GpuService::GpuService() : mGpuStats(std::make_unique()){}; +GpuService::GpuService() + : mGpuMem(std::make_unique()), mGpuStats(std::make_unique()) { + mGpuMem->initialize(); +}; void GpuService::setGpuStats(const std::string& driverPackageName, const std::string& driverVersionName, uint64_t driverVersionCode, @@ -110,6 +113,7 @@ status_t GpuService::doDump(int fd, const Vector& args, bool /*asProto } else { bool dumpAll = true; bool dumpDriverInfo = false; + bool dumpMem = false; bool dumpStats = false; size_t numArgs = args.size(); @@ -119,15 +123,21 @@ status_t GpuService::doDump(int fd, const Vector& args, bool /*asProto dumpStats = true; } else if (args[index] == String16("--gpudriverinfo")) { dumpDriverInfo = true; + } else if (args[index] == String16("--gpumem")) { + dumpMem = true; } } - dumpAll = !(dumpDriverInfo || dumpStats); + dumpAll = !(dumpDriverInfo || dumpMem || dumpStats); } if (dumpAll || dumpDriverInfo) { dumpGameDriverInfo(&result); result.append("\n"); } + if (dumpAll || dumpMem) { + mGpuMem->dump(args, &result); + result.append("\n"); + } if (dumpAll || dumpStats) { mGpuStats->dump(args, &result); result.append("\n"); diff --git a/services/gpuservice/GpuService.h b/services/gpuservice/GpuService.h index d1c3aabcce..6797868f00 100644 --- a/services/gpuservice/GpuService.h +++ b/services/gpuservice/GpuService.h @@ -28,6 +28,7 @@ namespace android { +class GpuMem; class GpuStats; class GpuService : public BnGpuService, public PriorityDumper { @@ -74,6 +75,7 @@ private: /* * Attributes */ + std::unique_ptr mGpuMem; std::unique_ptr mGpuStats; std::mutex mLock; std::string mDeveloperDriverPath; -- cgit v1.2.3-59-g8ed1b