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

server/2024/9/24 0:38:27/

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/server/115582.html

相关文章

Flask如何处理静态文件

Flask处理静态文件的方式相对直接且灵活&#xff0c;它为开发者提供了一种便捷的方式来管理应用中不会改变的文件&#xff0c;如CSS样式表、JavaScript脚本、图片等。以下是对Flask如何处理静态文件的详细简述&#xff1a; 1. 静态文件目录 Flask默认会在应用的根目录下寻找一…

【区块链通用服务平台及组件】ESGC 基准报告应用 | FISCO BCOS应用案例

环境社会治理公会&#xff08;The ESG Consortium 简称 ESGC&#xff09;是一个非营利组织&#xff0c;致力于推动环境、社会和治理实践&#xff0c; 并鼓励各行业&#xff0c;尤其是中小型企业的积极参与。 ESGC 通过提供一套可负担、可核算、可行动和易理解的 ESG 基准&…

【天池比赛】【零基础入门金融风控 Task2赛题理解】实战进行中……

2.3 代码示例 2.3.1 导入数据分析及可视化过程需要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import datetime import warnings warnings.filterwarnings(ignore) 2.3.2 读取文件 #读取数据时相对路径载入报错时…

DSC+DW自动安装工具

DSCDW自动安装工具 本次进行DSCDW的自动安装工具的使用&#xff0c;这里先安装一份两节点的DSC集群。 1.前期准备 1.1环境准备 数据库安装 两个节点上都得安装好DM数据库&#xff0c;暂时不用初始化实例&#xff0c;版本、安装路径都要一致 操作系统 两个都是使用的CentOS7…

Debian 包管理工具apt使用

apt基本用法 apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如Ubuntu、Linux Mint等&#xff09;中非常强大的软件包管理系统。它允许用户从远程仓库安装、更新、升级、配置和卸载软件包。除了我们已经讨论过的卸载软件包的功能外&…

STM32-UART配置注释

void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ // 这里是用户代码的开始部分&#xff0c;可以在这里添加任何初始化之前的自定义代码 // 但在这个例子中&#xff0c;它是空的 /* USER CODE END USART1_Init 0 */ /* 配置USART1的硬件参数 */ …

Windows下Python和PyCharm的应用(二)__快捷键方式的设定

前言 程序写久了&#xff0c;难免会形成自己的编程习惯。比如对某一套快捷键的使用&#xff0c;已经形成了肌肉记忆。 为了方便快捷键的使用&#xff0c;可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。&#xff08;因为早些年VC开发用的…

13款常用AI编程工具

AI编程工具的选择和使用&#xff0c;主要取决于具体的项目需求、编程语言、以及AI任务的类型&#xff08;如机器学习、自然语言处理、计算机视觉等&#xff09;。下面是一些广泛使用的AI编程工具合集&#xff0c;涵盖了从开发、训练、到部署的各个环节&#xff1a; Jupyter Not…