如何获取Power VR GPU数据

news2025/1/12 8:45:09

什么是Power VR

PowerVR 是Imagination公司生产的一种GPU系列。早期的苹果A系列芯片优秀的GPU性能大多是基于Power VR GPU实现的。从早期的游戏机实体建模到现在的移动终端设备图形计算中都能够见到它的身影,虽中间有多次动荡,至今依旧在汽车HMI系统中占据着比较大的份额。

如何获取Power VR GPU数据

虽然对于Power VR的GPU,近期已经很难见到了。不过依旧还是有不少性价比手机内部使用的是Power VR,而Imagination也很给力,把对应的API全都开源了,所以相比Adreno和Mali就方便不少。我们可以直接从开源代码中直接学习。

https://github.com/powervr-graphics/Native_SDKicon-default.png?t=M85Bhttps://github.com/powervr-graphics/Native_SDK在这个PowerVR开源的SDK中,包含了多个Demo,这边主要介绍的是如何获取性能数据。

我们以vulkan为例,将该项目clone到本地之后,进入到以下路径“Native_SDK/examples/Vulkan/PVRScopeExample/”

这边我们可以简单地使用Android Studio打开build-android文件夹,就会直接加载对应的库内容。其中可能存在这样一些问题。

Android存在的问题

1. Cmake路径没有指定(cmake没有识别出来)

com.intellij.openapi.externalSystem.model.ExternalSystemException (no error message)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Exception is:
com.intellij.openapi.externalSystem.model.ExternalSystemException: 
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.addBuildModels(ProjectImportAction.java:258)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:116)
	at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:41)
	at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:64)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.runAction(ClientProvidedPhasedActionRunner.java:120)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.run(ClientProvidedPhasedActionRunner.java:110)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner$ActionRunningListener.buildFinished(ClientProvidedPhasedActionRunner.java:104)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	

这个问题就是配置问题,可以在local.properties中设置cmake的路径,在里面加上

cmake.dir=D\:\\SDK\\cmake\\3.18.1

具体路径根据用户计算机的cmake路径和版本决定。

主要还是因为Android Studio上默认安装的cmake和配置要求的版本号不匹配。

2. NDK路径问题

同样的,在local.properties中设置ndk的路径,在里面加上

ndk.dir=D\:\\SDK\\ndk\\21.4.7075529

具体的路径依旧是根据用户计算机中的ndk路径配置。

加载完成

正确加载Android Studio后,会在Gradle Scipts下面出现其他几个module的build.gradle文件,这是因为即便是简单的PVRScope Example也是需要依赖于其他Module的。

这时候只需要点击菜单栏 Build->Build Bundle(s)/APK(s)->Build APK(s)即可。

但是这时候感觉会有点懵逼,因为打开主要的Java文件中,我们只会看到一个简单的Java文件,内容也很简单,如下:

package com.powervr.VulkanPVRScopeExample;


import android.app.NativeActivity;
import android.os.Bundle;
import android.widget.Toast;
import android.view.Gravity;

public class VulkanPVRScopeExample extends NativeActivity
{
	public void displayExitMessage(final String text) 
	{
		runOnUiThread(new Runnable() {
		public void run() {
			Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG);
			toast.setGravity(Gravity.CENTER, 0, 0);
			toast.show();
		}
		});
	}
}

那么这个APK的核心究竟在哪里呢?

这时候可以注意到,这个Class继承的是NativeActivity,因此主要的代码应该是外围的C源码。

C++ Android 源码

该源码主要指的是VulkanPVRScopeExample.cpp文件

包括initApplication, initView, releaseView, quitApplication和renderFrame,我们都能很清楚的看懂内部逻辑,但是对于C/C++不太熟悉的就会比较困难了。

这个文件中主要是对于UI框架和显示以及动作的一些描写,如果要关注具体的值获取可以跳过。

C++获取图形数据

该源码主要指的是PVRScopeGraph.h和PVRScopeGraph.cpp文件

在源码中,构建了

class PVRScopeGraph

用于直接获取PVR的图形数据。在里面封装了如下方法,主要也是通过调用如下方法获取所需的图形图像数据。

    uint32_t getActiveGroup() const { return activeGroup; }
	float getMaximumOfData(uint32_t nCounter);
	float getMaximum(uint32_t nCounter);
	void setMaximum(uint32_t nCounter, float fMaximum);
	float getStandardFPS() const;
	int32_t getStandardFPSIndex() const;
	float getStandard2D() const;
	int32_t getStandard2DIndex() const;
	float getStandard3D() const;
	int32_t getStandard3DIndex() const;
	float getStandardTA() const;
	int32_t getStandardTAIndex() const;
	float getStandardCompute() const;
	int32_t getStandardComputeIndex() const;
	float getStandardShaderPixel() const;
	int32_t getStandardShaderPixelIndex() const;
	float getStandardShaderVertex() const;
	int32_t getStandardShaderVertexIndex() const;
	float getStandardShaderCompute() const;
	int32_t getStandardShaderComputeIndex() const;
	uint32_t getCounterNum() const { return numCounter; }
	const char* getCounterName(const uint32_t i) const;
	int getCounterGroup(const uint32_t i) const;

如果要开发对应的C++应用就很方便,但是如果要在Android使用Jni的方法编写对应的app就非常麻烦,需要在setting.gradle中将所有的模块Include进来,这多种依赖又是一个比较大的工程,容易牵一发而动全身,显然不是一个非常方便的做法。

另辟蹊径

我这边的目标主要是通过APK或者app_process的方式获取手机内的Power VR的图形图像信息,最好还是能够通过Java或者kotlin + Jni的方式实现,比起include这么多module,如果能够直接把需要的内容剥离出来就好了。

https://github.com/powervr-graphics/PVRMonitoricon-default.png?t=M85Bhttps://github.com/powervr-graphics/PVRMonitorPowerVR官方还提供了一个apk的项目,里面很简单地将Scope内容剥离出来,倒是可以直接小修小改用上。

该项目使用Jni的方式调用了PVRScopeGraph和CpuMetrics(顺便),不过项目时间比较长,实际使用起来会发现在现在(date up to 2022)的一些设备,甚至是早期的Redmi 9A手机,都不是很支持的样子。这是因为对应的内容需要修改。

修改方式

1. 更换.so文件

在上一节中说到了,最好是将各种Module直接剥离出来,这边就是采取了这样的思路,将各种需要的模块编译出libPVRScopeDeveloper.so,然后直接调用里面的方法,里面的方法在PVRScopeStats.h里面,可以进行参考。

但是存在的问题在于,这个项目的so文件过于老旧,所以需要更换最新的,需要自己编译出新版的libPVRScopeDeveloper.so文件,当然也可以下载官方的PVRTune Developers,然后寻找对应的so文件拷贝出来替换。

2. 添加初始化代码

在PVRScopeHUD.cpp文件中的initialisePVRScope()方法中,本意是用来初始化PVR数据读取的,但是在初始化的过程中获取了一次Counter,而在PVRScopeStats.h中有说明,在获取Counter数据前需要不时地调用PVRScopeReadCounters方法,所以在该方法的

//Initialise the counter data structures.

之前,最好加上一句

readCounters(true); // this method is defined in the class

直接调用了原项目已经封装好的readcounters,再获取一次Counter数据就能够不出问题了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面板模型进行熵值法分析

背景说明 熵值法(熵权法)是一种研究指标权重的研究方法,比如有5个指标,分别为指标1到指标5,并且有很多样本(比如100个样本),即100行*5列数据,此时研究该5个指标的权重分…

可编程直流电源的特点都有哪些呢?

可编程直流电源是用数字或编码器输入,非电位器调节电压、电流的直流电源。无论是在研发,还是生产测试中,可编程直流电源的宽范围电压输出都适于测试和分析组件、电路、模块和完整器件的特性。那么可编程直流电源的特点都有哪些呢?下面安泰测…

【Java系列】一篇文章阐述常见问题及解决方法

返回主篇章         👇 【Java】才疏学浅小石Java问道之路 Java常见问题及解决方法问题1问题2问题3问题4问题1 问题提出: 解决问题: 源文件名不存在或者写错当前路径错误后缀名隐藏问题 问题2 问题提出: 解决问题&a…

加码中文 AIGC,IDEA 推出“盖亚计划”

作者 | 伍杏玲 出品 | CSDN 近年来,AIGC 话题火爆 AI 技术人的朋友圈。由于深度学习模型不断完善、开源模式推动,AIGC 的迭代速度呈爆发式发展。据 Gartner 发布的 2022 年需要探索的重要战略技术趋势显示,生成式 AI 是其中引人注目的人工智…

uniapp开发小程序-工作笔记

开发背景 公司开始安排本人开发微信小程序,于是乎研究了一点关于uniapp的api和注意的点。仅仅是个人笔记…可能有错误,希望各位指出。 uniapp开发小程序 应用生命周期 onLaunch 初始化完成时 只触发一次 onShow 后台进入前台 显示页面的时候 onHide 前台…

全志V853 NPU 转换部署 YOLO V5 模型

NPU 转换部署 YOLO V5 模型 本文以 YOLO v5s 模型为例,详述 ONNX 模型在 V853 平台的转换与部署的流程。 模型的准备 YOLO v5 目前开源于 Github,链接【GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TF…

【Android App】实战项目之虚拟现实(VR)的全景相册(附源码和演示视频 可用于学习和大作业)

需要源码请点赞关注收藏后评论区留言私信~~~ 不管是绘画还是摄影,都是把三维的物体投影到平面上,其实仍旧呈现二维的模拟画面。 随着科技的发展,传统的成像手段越来越凸显出局限性,缘由在于人们需要一种更逼真更接近现实的技术&am…

基于有偏距离权值(Weighted cubic O-MOMS with warping)三次O-MOMS插值理论的图像超分辨重构研究-附Matlab程序

⭕⭕ 目 录 ⭕⭕✳️ 一、图像超分辨率重构原理✳️ 二、三次O-MOMS插值重构理论与实验分析✳️ 2.1 三次O-MOMS(Cubic O-MOMS)插值理论与实验验证✳️ 2.2 有偏距离三次O-MOMS插值重构理论与实验验证✳️ 2.3 权重三次O-MOMS插值理论与实验验证✳️ 2.4 有偏距离权值三次O-MOM…

[附源码]Python计算机毕业设计Django茶叶销售微信小程序

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Hive 查看和修改 tez 容器的资源

1. 查看当前的配置 1.1 进入 AppMaster 或 History 进入运行中,或者运行完作业对应的 “Tracking URL”。以下示例是已经运行完的 job。 1.2 进入 tez-ui 进入 tez-ui 之后,点击 Configurations 1.3 查看配置 输入要查询的配置项,点击…

随smart登陆欧洲,亿咖通科技踏上出海新征程

随着全新smart精灵#1正式登陆欧洲,全球移动出行科技公司亿咖通科技同步向欧洲车主揭晓其搭载于新车上的下一代智能座舱系统,并正式将其出海战略向前推进关键一步,成为中国智能化出海的一座崭新里程碑。 全新smart精灵#1预计将于2022年底开始&…

π220N31兼容代替TI ISO1540DR 低功耗 3.0kVrms 双向I2C 隔离器

π220N31兼容代替TI ISO1540DR 低功耗 3.0kVrms 双向I2C 隔离器,I2C隔离器输入和输出采用二氧化硅(SiO2)介质隔离,可阻断高电压并防止噪声电流进入控制侧,避免电路干扰和损坏敏感器件。与光电耦合器相比,在功能、性能、尺寸和功耗…

2022年全国最新消防设施操作员模拟真题题库及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 124、消防电梯设置应符合下列哪些( )要求 A.消防电梯载重量不应小于800kg …

麦芽糖-阿奇霉素 maltose-Azithromycin

麦芽糖-阿奇霉素 maltose-Azithromycin 中文名称:麦芽糖-阿奇霉素 英文名称:maltose-Azithromycin 别称:阿奇霉素修饰麦芽糖,阿奇霉素-麦芽糖 PEG接枝修饰麦芽糖 麦芽糖-聚乙二醇-阿奇霉素 Azithromycin-PEG-maltose 阿…

@企业主们看过来,用华为云CDN给你的网页加个速

企业主们看过来,用华为云CDN给你的网页加个速 前段时间参加秋招的时候,被问到了一个问题,CND是干啥的,什么是CND,面试官问我这个问题的时候,我暗窃喜这不是我的强项吗!!!…

【C++面向对象程序设计】CH5 继承与派生(续)——虚基类

目录 前言 一、虚基类的作用 二、虚基类的初始化 三、例【5.9】在【例5.8】中在teacher类和student类之上增加一个共同的基类person,人员的一些基本数据放在person中 四、多层多重继承用虚基类 五、虚基类的构造函数 六、多重继承如何工作 七、虚拟继承 八…

【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)

前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍。 线程状态流转及生命周期 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不…

17. 电话号码的字母组合

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits …

R语言分布滞后非线性模型(DLNM)研究发病率,死亡率和空气污染示例

全文下载链接:http://tecdat.cn/?p21317本文提供了运行分布滞后非线性模型的示例,同时描述了预测变量和结果之间的非线性和滞后效应,这种相互关系被定义为暴露-滞后-反应关联(点击文末“阅读原文”获取完整代码数据)。…

C语言文件操作

目录序言文件程序文件&数据文件程序文件数据文件文本文件&二进制文件文件名操作初阶打开&关闭文件fopen读写文件fputc & fgetc文件缓冲区文件指针操作进阶打开方式"w"(只写)"r"(只读)"a"(追加)文件的顺序读写fgets & fputsf…