鸿蒙(API 12 Beta6版)GPU加速引擎服务【空域GPU超分】

ops/2024/9/23 19:36:56/

XEngine Kit提供空域GPU超分能力,其基于单帧输入图像,使用空间邻域信息实现超采样,开销较小同时收益可观,建议使用超分倍率为[1.2, 1.5]。

接口说明

以下接口为GLES和Vulkan空域GPU超分设置接口,如要使用更丰富的设置和查询接口。

接口名描述
const GLubyte * HMS_XEG_GetString (GLenum name)XEngine GLES扩展特性查询接口。
GL_APICALL void GL_APIENTRY HMS_XEG_SpatialUpscaleParameter (GLenum pname, GLvoid *param)设置空域GPU超分输入参数。
GL_APICALL void GL_APIENTRY HMS_XEG_RenderSpatialUpscale (GLuint inputTexture)执行空域GPU超分渲染命令。
VKAPI_ATTR VkResult VKAPI_CALL HMS_XEG_EnumerateDeviceExtensionProperties (VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, XEG_ExtensionProperties *pProperties)XEngine Vulkan扩展特性查询接口。
VKAPI_ATTR VkResult VKAPI_CALL HMS_XEG_CreateSpatialUpscale (VkDevice device, const XEG_SpatialUpscaleCreateInfo *pXegSpatialUpscaleCreateInfo, XEG_SpatialUpscale *pXegSpatialUpscale)创建XEG_SpatialUpscale对象。
VKAPI_ATTR void VKAPI_CALL HMS_XEG_CmdRenderSpatialUpscale (VkCommandBuffer commandBuffer, XEG_SpatialUpscale xegSpatialUpscale, XEG_SpatialUpscaleDescription *pXegSpatialUpscaleDescription)执行空域GPU超分渲染命令。
VKAPI_ATTR void VKAPI_CALL HMS_XEG_DestroySpatialUpscale (XEG_SpatialUpscale xegSpatialUpscale)销毁XEG_SpatialUpscale对象。

开发步骤

本章以GLES/Vulkan图像API集成为例,说明XEngine集成操作过程。

配置项目

编译HAP时,Native层so编译需要依赖NDK中的libxengine.so。

  • 头文件引用

按需引用XEngine的头文件,如使用GLES空域GPU超分。

#include <cstring>
#include <cstdlib>
#include <xengine/xeg_gles_extension.h>
#include <xengine/xeg_gles_spatial_upscale.h>

按需引用XEngine的头文件,如使用Vulkan空域GPU超分。

#include <string>
#include <vector>
#include <algorithm>
#include <xengine/xeg_vulkan_extension.h>
#include <xengine/xeg_vulkan_spatial_upscale.h>
  • 编写CMakeLists.txt

按需引用XEngine的CMakeLists,如使用GLES空域GPU超分功能,CMakeLists.txt部分示例代码如下。

find_library(# Sets the name of the path variable.xengine-lib# Specifies the name of the NDK library that you want CMake to locate.xengine
)
find_library(# Sets the name of the path variable.EGL-lib# Specifies the name of the NDK library that you want CMake to locate.EGL
)
find_library(# Sets the name of the path variable.GLES-lib# Specifies the name of the NDK library that you want CMake to locate.GLESv3
)target_link_libraries(nativerender PUBLIC
${EGL-lib} ${GLES-lib} ${xengine-lib})

按需引用XEngine的CMakeLists,如使用Vulkan空域GPU超分功能,CMakeLists.txt部分示例代码如下。

find_library(# Sets the name of the path variable.xengine-lib# Specifies the name of the NDK library that you want CMake to locate.xengine
)
find_library(# Sets the name of the path variable.EGL-lib# Specifies the name of the NDK library that you want CMake to locate.EGL
)
find_library(# Sets the name of the path variable.Vulkan-lib# Specifies the name of the NDK library that you want CMake to locate.vulkan
)target_link_libraries(nativerender PUBLIC
${EGL-lib} ${Vulkan-lib} ${xengine-lib})

集成XEngine空域GPU超分(GLES)

使用EGL和GLES图形API搭建图像渲染管线并集成空域GPU超分在Native层实现,渲染结果通过[XComponent]组件显示到屏幕。

本节阐述GLES图形API的空域GPU超分的使用。

  1. 调用[HMS_XEG_GetString]接口,查询XEngine支持的GLES扩展信息,如果支持则表示该特性相关接口可以使用。
// 查询XEngine支持的GLES扩展信息
const char* extensions = (const char*)HMS_XEG_GetString(XEG_EXTENSIONS);
// 检查是否支持空域GPU超分
if (!strstr(extensions, XEG_SPATIAL_UPSCALE_EXTENSION_NAME)) {exit(1); // return error
}
  1. 调用[HMS_XEG_SpatialUpscaleParameter]接口,对空域GPU超分的参数赋值。
// m_sharpness为用户自定义超分锐化参数,此处以参数为0.3f为例
float m_sharpness = 0.3f;
// m_renderWidth与m_renderHeight分别为用户自定义的渲染宽度与渲染高度,此处以800*600分辨率为例
uint32_t m_renderWidth = 800;
uint32_t m_renderHeight = 600;
HMS_XEG_SpatialUpscaleParameter(XEG_SPATIAL_UPSCALE_SHARPNESS, &m_sharpness);
// upscaleScissor为超分输入图像的采样区域
int upscaleScissor[4] = {0, 0, static_cast<int>(m_renderWidth), static_cast<int>(m_renderHeight)}; 
HMS_XEG_SpatialUpscaleParameter(XEG_SPATIAL_UPSCALE_SCISSOR, upscaleScissor);
  1. 调用[HMS_XEG_RenderSpatialUpscale]接口进行超分。
// upscaleFBO为用户自定义创建的framebuffer
unsigned int upscaleFBO;
glBindFramebuffer(GL_FRAMEBUFFER, upscaleFBO); 
// m_upscaleWidth和m_upscaleHeight分别为用户自定义超分宽度和超分高度,此处以超分至1200*900分辨率为例
uint32_t m_upscaleWidth = 1200;
uint32_t m_upscaleHeight = 900;
glViewport(0, 0, m_upscaleWidth, m_upscaleHeight);
glScissor(0, 0, m_upscaleWidth, m_upscaleHeight); 
// upscaleColorBuffer为纹理附件,用户可自定义
unsigned int upscaleColorBuffer;
HMS_XEG_RenderSpatialUpscale(upscaleColorBuffer);

upscaleFBO是已创建完成的framebuffer,并绑定纹理,超分接口调用后绘制到纹理上。

集成XEngine空域GPU超分(Vulkan)

使用Vulkan图形API搭建图像渲染管线并集成空域GPU超分在Native层实现,渲染结果通过[XComponent]组件显示到屏幕。

本节阐述Vulkan图形API的空域GPU超分使用

  1. 调用[HMS_XEG_EnumerateDeviceExtensionProperties]接口,查询XEngine支持的Vulkan扩展列表。
// physicalDevice为vulkan物理设备,用户需进行初始化
VkPhysicalDevice physicalDevice;
// 查询XEngine支持的Vulkan扩展列表
std::vector<std::string> supportedExtensions;
uint32_t pPropertyCount;
HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice, &pPropertyCount, nullptr);
if (pPropertyCount > 0) {std::vector<XEG_ExtensionProperties> pProperties(pPropertyCount);if (HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice, &pPropertyCount, &pProperties.front()) == VK_SUCCESS) {for (auto ext : pProperties) {supportedExtensions.push_back(ext.extensionName);}}
}
// 查询是否支持空域GPU超分
if (std::find(supportedExtensions.begin(), supportedExtensions.end(), XEG_SPATIAL_UPSCALE_EXTENSION_NAME) == supportedExtensions.end()) {exit(1); // return error
}
  1. 声明实例句柄。
XEG_SpatialUpscale xegSpatialUpscale;
  1. 调用[HMS_XEG_CreateSpatialUpscale]接口,创建超分实例。
// 渲染宽高和超分后宽高均为用户自定义参数,此处以将800*600分辨率超分至1200*900分辨率为例
uint32_t m_renderWidth = 800;
uint32_t m_renderHeight = 600;
uint32_t m_upscaleWidth = 1200;
uint32_t m_upscaleHeight = 900;
// vulkan逻辑设备,用户需进行初始化
VkDevice device;
// VkRect2D为vulkan指定的二维区域结构
// srcRect2D为超分输入纹理区域,用户可自定义
VkRect2D srcRect2D;
// srcRect2D.offset.x和srcRect2D.offset.y为原点偏移量
srcRect2D.offset.x = 0;
srcRect2D.offset.y = 0;
// srcRect2D.extent.width与srcRect2D.extent.height为输入纹理宽高
srcRect2D.extent.width = m_renderWidth; 
srcRect2D.extent.height = m_renderHeight; 
// dstRect2D为超分输出纹理区域,用户可自定义
VkRect2D dstRect2D;
// dstRect2D.offset.x和dstRect2D.offset.y为原点偏移量
dstRect2D.offset.x = 0;
dstRect2D.offset.y = 0;
// dstRect2D.extent.width与dstRect2D.extent.height为超分纹理宽高
dstRect2D.extent.width = m_upscaleWidth; 
dstRect2D.extent.height = m_upscaleHeight; 
XEG_SpatialUpscaleCreateInfo createInfo;
createInfo.format = VK_FORMAT_R8G8B8A8_UNORM;
// sharpness为用户自定义超分锐化参数,此处以参数为0.3f为例
createInfo.sharpness = 0.3f;
createInfo.outputSize = dstRect2D.extent;
createInfo.inputRegion = srcRect2D;
createInfo.outputRegion = dstRect2D;
HMS_XEG_CreateSpatialUpscale(device, &createInfo, &xegSpatialUpscale);
  1. 调用[HMS_XEG_CmdRenderSpatialUpscale]接口下发超分,每帧都需要调用。
// inputImageView为用户创建的超分输入图像的vkImageView
VkImageView inputImageView = VK_NULL_HANDLE; 
// outputImageView为用户创建的超分输出图像的vkImageView
VkImageView outputImageView = VK_NULL_HANDLE;
// cmdBuff为命令缓冲区,用户需进行初始化
VkCommandBuffer cmdBuff = VK_NULL_HANDLE ;
XEG_SpatialUpscaleDescription xegDescription;
xegDescription.inputImage = inputImageView; 
xegDescription.outputImage = outputImageView; 
HMS_XEG_CmdRenderSpatialUpscale(cmdBuff, xegSpatialUpscale, &xegDescription);
  1. 调用[HMS_XEG_DestroySpatialUpscale]接口销毁实例。
HMS_XEG_DestroySpatialUpscale(xegSpatialUpscale);

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 鸿蒙 (OpenHarmony)开发学习视频》
  • 鸿蒙生态应用开发V2.0白皮书》
  • 鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 鸿蒙开发基础》
  • 鸿蒙开发进阶》
  • 鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
1


http://www.ppmy.cn/ops/109577.html

相关文章

计算机知识科普问答--8 (36-40)

36、什么是控制总线? 控制总线(Control Bus) 定义: 控制总线是用于在计算机系统中传输控制信号的线路,控制 CPU、内存和 I/O 设备之间的操作和通信。主要信号类型: 读/写信号(Read/Write):控制内存和 I/O 设备的读写操作。地址有效信号(Address Valid):指示地址总…

Vuex说明

.js 项目中&#xff0c;使用 Vuex 进行状态管理时&#xff0c;你通常会创建一个 store 文件&#xff08;或文件夹&#xff0c;其中包含多个模块&#xff09;来集中管理应用的所有状态。这个文件&#xff08;或文件夹&#xff09;中的 store 实例是 Vuex 的核心&#xff0c;它包…

【开发】git相关

gitlab查看/添加自己的access token&#xff1a; 点击自己的头像点击preferences/偏好设置点击Access tokens即可看到personal access tokens&#xff0c;如果已经有创建&#xff0c;在Feed token中即可看到。 gitlab查看/添加自己的SSH keys&#xff1a; 点击自己的头像点击…

Linux-文本处理三剑客:grep、sed-和-awk

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

【论文精读】PatchTST-基于分块及通道独立机制的Transformer模型

《A TIME SERIES IS WORTH 64 WORDS: LONG-TERM FORECASTING WITH TRANSFORMERS》的作者团队来自Princeton University 和 IBM Research,发表在 ICLR 2023 会议上。 动机 Transformer模型因其自注意力机制在处理序列数据方面的优势,在自然语言处理(NLP)、计算机视觉(CV)…

React函数组件传参

在React中&#xff0c;函数组件&#xff08;Function Components&#xff09;是定义组件的一种方式&#xff0c;它们本质上是JavaScript函数&#xff0c;可以接受props&#xff08;属性&#xff09;作为参数&#xff0c;并返回React元素。这些props允许你从父组件向子组件传递数…

④JdbcTemplate与声明式事务

JdbcTemplate 1.概述 前面我们已经学习了 Spring 中的Core Container核心部分和AOP、Aspects等面向切面编程部分&#xff0c;接下来就是Data Access/Integration即数据访问和集成部分 Spring 既可以单独使用&#xff0c;也可以集成其他框架&#xff0c;如Hibernate、MyBatis…

Ubuntu20.04使用systemd配置Gogs开机启动

先说现象&#xff0c;大家用sudo systemctl start gogs是不是和我一样&#xff1f; ubunturaspberry-pi:~$ sudo systemctl status gogs ● gogs.service - GogsLoaded: loaded (/lib/systemd/system/gogs.service; enabled; vendor preset: enabled)Active: failed (Result: …