2021-02-22

TI jacinto 图形和显示
此SDK支持的TI SoC设备系列具有专用硬件块,用于加速3D图形和显示合成。此页提供有关这些硬件块支持的功能的详细信息。
• 3.6.1. 介绍
• 3.6.2. 软件体系结构
• 3.6.3. 图形演示
• 3.6.4. 显示器
• 3.6.4.1. 查找连接器ID
• 3.6.4.2. 查找Plane ID
• 3.6.5. Wayland/Weston
• 3.6.5.1. 运行Weston客户端
• 3.6.5.2. 使用Wayland接收器运行多媒体
• 3.6.5.3. 离开Weston
• 3.6.5.4. 使用IVI shell功能
• 3.6.5.4.1. 用IVI shell运行Weston的示例客户端应用程序
• 3.6.5.4.2. 使用IVI shell运行QT应用程序
• 3.6.6. 使用PowerVR工具
• 3.6.6.1. PVRTune
• 3.6.6.2. PVRTrace
3.6.1. 介绍
J721E设备支持基于Imagination Technologies Inc.的Rogue 8XE系列的3D图形加速器。它支持使用OpenGL®ES API的3D图形渲染。硬件支持OpenGL®ES API的3.2版本及以下版本。
支持以下扩展:

EGL client extensions
•	EGL_EXT_client_extensions
•	EGL_EXT_platform_base
•	EGL_KHR_client_get_all_proc_addresses
•	EGL_KHR_debug
•	EGL_EXT_platform_wayland
•	EGL_MESA_platform_gbm
EGL extensions
•	EGL_ANDROID_native_fence_sync
•	EGL_EXT_buffer_age
•	EGL_EXT_create_context_robustness
•	EGL_EXT_image_dma_buf_import
•	EGL_EXT_image_dma_buf_import_modifiers
•	EGL_IMG_context_priority
•	EGL_KHR_config_attribs
•	EGL_KHR_create_context
•	EGL_KHR_fence_sync
•	EGL_KHR_get_all_proc_addresses
•	EGL_KHR_gl_renderbuffer_image
•	EGL_KHR_gl_texture_2D_image
•	EGL_KHR_gl_texture_cubmap_image
•	EGL_KHR_image
•	EGL_KHR_image_base
•	EGL_KHR_image_pixmap
•	EGL_KHR_no_config_context
•	EGL_KHR_reusable_sync
•	EGL_KHR_surfaceless_context
•	EGL_KHR_wait_sync
•	EGL_MESA_configless_context
•	EGL_MESA_drm_image
•	EGL_MESA_image_dma_buf_export
•	EGL_WL_bind_wayland_display
•	EGL_IMG_cl_image
GL extensions
•	GL_ANDROID_extension_pack_es31a
•	GL_EXT_blend_minmax
•	GL_EXT_buffer_storage
•	GL_EXT_clip_control
•	GL_EXT_color_buffer_float
•	GL_EXT_conservative_depth
•	GL_EXT_copy_image
•	GL_EXT_discard_framebuffer
•	GL_EXT_draw_buffers
•	GL_EXT_draw_buffers_indexed
•	GL_EXT_draw_elements_base_vertex
•	GL_EXT_EGL_image_array
•	GL_EXT_float_blend
•	GL_EXT_geometry_point_size
•	GL_EXT_geometry_shader
•	GL_EXT_gpu_shader5
•	GL_EXT_memory_object
•	GL_EXT_multisampled_render_to_texture
•	GL_EXT_multisampled_render_to_texture2
•	GL_EXT_occlusion_query_boolean
•	GL_EXT_polygon_offset_clamp
•	GL_EXT_primitive_bounding_box
•	GL_EXT_pvrtc_sRGB
•	GL_EXT_read_format_bgra
•	GL_EXT_robustness
•	GL_EXT_separate_shader_objects
•	GL_EXT_shader_framebuffer_fetch
•	GL_EXT_shader_group_vote
•	GL_EXT_shader_implicit_conversions
•	GL_EXT_shader_io_blocks
•	GL_EXT_shader_non_constant_global_initializers
•	GL_EXT_shader_pixel_local_storage
•	GL_EXT_shader_pixel_local_storage2
•	GL_EXT_shader_texture_lod
•	GL_EXT_shadow_samplers
•	GL_EXT_sparse_texture
•	GL_EXT_sRGB_write_control
•	GL_EXT_tessellation_point_size
•	GL_EXT_tessellation_shader
•	GL_EXT_texture_border_clamp
•	GL_EXT_texture_buffer
•	GL_EXT_texture_cube_map_array
•	GL_EXT_texture_filter_anisotropic
•	GL_EXT_texture_format_BGRA8888
•	GL_EXT_texture_rg
•	GL_EXT_texture_sRGB_decode
•	GL_EXT_texture_sRGB_R8
•	GL_EXT_texture_sRGB_RG8
•	GL_EXT_YUV_target
•	GL_IMG_bindless_texture
•	GL_IMG_framebuffer_downsample
•	GL_IMG_multisampled_render_to_texture
•	GL_IMG_program_binary
•	GL_IMG_texture_compression_pvrtc
•	GL_IMG_texture_compression_pvrtc2
•	GL_IMG_texture_filter_cubic
•	GL_IMG_texture_format_BGRA8888
•	GL_IMG_texture_npot
•	GL_KHR_blend_equation_advanced
•	GL_KHR_blend_equation_advanced_coherent
•	GL_KHR_debug
•	GL_KHR_robustness
•	GL_KHR_texture_compression_astc_ldr
•	GL_KHR_compressed_ETC1_RGB8_texutre
•	GL_OES_depth24
•	GL_OES_depth_texture
•	GL_OES_draw_buffers_indexed
•	GL_OES_draw_elements_base_vertex
•	GL_OES_EGL_image_external_essl3
•	GL_OES_EGL_sync
•	GL_OES_element_index_uint
•	GL_OES_fragment_precision_high
•	GL_OES_geometry_point_size
•	GL_OES_geometry_shader
•	GL_OES_get_program_binary
•	GL_OES_gpu_shader5
•	GL_OES_mapbuffer
•	GL_OES_packed_depth_stencil
•	GL_OES_required_internalformat
•	GL_OES_rgb8_rgba8
•	GL_OES_sample_shading
•	GL_OES_sample_variables
•	GL_OES_shader_image_atomic
•	GL_OES_shader_io_blocks
•	GL_OES_shader_multisample_interpolation
•	GL_OES_standard_derivatives
•	GL_OES_surfaceless_context
•	GL_OES_tessellation_point_size
•	GL_OES_tessellation_shader
•	GL_OES_texture_border_clamp
•	GL_OES_texture_buffer
•	GL_OES_texture_cube_map_array
•	GL_OES_texture_float
•	GL_OES_texture_half_float
•	GL_OES_texture_npot
•	GL_OES_texture_stencil8
•	GL_OES_texture_storage_multisample_2d_array
•	GL_OES_vertex_array_object
•	GL_OES_vertex_half_float

OpenGL®ES和EGL®库打包在处理器SDK Linux J721e中,并被Wayland/Weston等图形栈使用。驱动程序运行在ARM内核上,并通过用户应用程序提交的渲染命令对运行在GPU内核中的固件进行编程。
本页的其余部分将涵盖以下主题:
•图形软件架构
•关于如何运行图形演示的说明
•关于如何运行DSS应用程序的说明
•关于如何启动Weston的说明
•关于如何运行PVR工具的说明
3.6.2. 软件体系结构
下图显示了处理器SDK Linux J721e中图形的软件架构。
在这里插入图片描述

图3.4 PSDK Linux 7图形软件栈
3.6.3. 图形演示
除了图形驱动程序和用户空间库之外,SDK还包括示例应用程序。一些演示基于IMG Native_SDK示例。
以下演示可在Wayland窗口系统下运行.

target # /usr/bin/SGX/demos/Wayland/OpenGLESDeferredShading
target # /usr/bin/SGX/demos/Wayland/OpenGLESGaussianBlur
target # /usr/bin/SGX/demos/Wayland/OpenGLESImageBasedLighting
target # /usr/bin/SGX/demos/Wayland/OpenGLESIntroducingPVRCamera
target # /usr/bin/SGX/demos/Wayland/OpenGLESIntroducingPVRUtils
target # /usr/bin/SGX/demos/Wayland/OpenGLESIntroducingUIRenderer
target # /usr/bin/SGX/demos/Wayland/OpenGLESNavigation2D
target # /usr/bin/SGX/demos/Wayland/OpenGLESNavigation3D
target # /usr/bin/SGX/demos/Wayland/OpenGLESParticleSystem

3.6.4. 显示器
TI SoC配备了显示子系统(DSS)硬件,为覆盖层的alpha混合和颜色转换提供硬件加速。DSS硬件暴露于通过libdrm模块提供的软件drmapi。通过这个drm接口,用户空间程序可以执行显示器的模式设置。
drm模块将显示硬件建模为一系列抽象的硬件块,并通过API对其进行管理。这些块是:
•CRTC[1]:表示扫描输出引擎,该引擎根据扫描输出缓冲区指向的数据生成视频定时信号
•连接器:表示视频定时信号发送到显示器的位置
•编码器:将来自CRTC的视频定时信号转换为适合通过连接器发送的格式
•平面:表示CRTC可以使用的覆盖缓冲区
实用程序应用程序modetest可用于获取可用drm块的列表。使用它可以显示设备的所有可用信息。
3.6.4.1. 查找连接器ID
运行以下modetest命令:

target # modetest -M tidss -c

查找需要连接器ID的显示设备,如HDMI、LCD等。

Connectors:
id      encoder status          type    size (mm)       modes   encoders
4       3       connected       HDMI-A  480x270         20      3
  modes:
        name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
  1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 flags: phsync, pvsync; type: preferred, driver
...
16      15      connected       unknown 0x0             1       15
  modes:
        name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
  800x480 60 800 1010 1040 1056 480 502 515 525 flags: nhsync, nvsync; type: preferred, driver

所显示的模式是连接显示器所支持的各种分辨率.
3.6.4.2. 查找平面ID

要查找平面ID,请运行modetest命令:

target # modetest -M tidss -p
应该显示如下内容:
 
Planes:
id      crtc    fb      CRTC x,y        x,y     gamma size
19      0       0       0,0             0,0     0
 formats: RG16 RX12 XR12 RA12 AR12 XR15 AR15 RG24 RX24 XR24 RA24 AR24 NV12 YUYV UYVY
 props:
 ...
20      0       0       0,0             0,0     0
 formats: RG16 RX12 XR12 RA12 AR12 XR15 AR15 RG24 RX24 XR24 RA24 AR24 NV12 YUYV UYVY
 props:
 ...
 

3.6.5. Wayland/Weston
受支持的Wayland/Weston版本在扩展桌面模式下引入了多显示器支持,并且能够将窗口从一个显示器拖放到另一个显示器。
要启动Weston,请执行以下操作:

在目标控制台上:
target # unset WAYLAND_DISPLAY
在默认显示上:
target # weston --tty=1 --connector=<default connector-id>
在辅助显示器上:
target # weston --tty=1 --connector=<secondary connector-id>
在所有连接的显示器(LCD和HDMI)上:
target # weston --tty=1
默认情况下,屏幕保护程序超时配置为300秒。用户可以使用命令行选项更改屏幕保护程序超时:
--idle-time=<number of seconds>
例如,要将超时设置为10分钟,并将Weston配置为在所有连接器上显示,请使用以下命令:
weston --tty=1 --idle-time=600
要禁用屏幕超时并将Weston配置为在所有连接器上显示,请使用以下命令:
weston --tty=1 --idle-time=0

如果您在上述过程中遇到任何问题,请参考常见问题解答GLSDK_FAQs#Unable_to_run_Weston_on_the_GLSDK_releas。
文件系统带有一个预先配置好的weston.ini文件,该文件将位于
/etc/weston.ini
3.6.5.1. 运行Weston客户端

Weston客户机示例可以从串口控制台或SSH控制台上的命令行运行。启动Weston后,用户应该能够使用键盘和鼠标进行各种控制。

# /usr/bin/weston-flower
# /usr/bin/weston-clickdot
# /usr/bin/weston-cliptest
# /usr/bin/weston-dnd
# /usr/bin/weston-editor
# /usr/bin/weston-eventdemo
# /usr/bin/weston-image /usr/share/weston/terminal.png
# /usr/bin/weston-resizor
# /usr/bin/weston-simple-egl
# /usr/bin/weston-simple-shm
# /usr/bin/weston-simple-touch
# /usr/bin/weston-smoke
# /usr/bin/weston-info
# /usr/bin/weston-terminal

3.6.5.2. 使用Wayland sink运行多媒体

Wayland的GStreamer视频接收器是waylandsink。要使用此视频接收器进行视频播放,请执行以下操作:

target # gst-launch-1.0 playbin uri=file://<path-to-file-name> video-sink=waylandsink

3.6.5.3. 离开Weston

在离开Weston之前终止所有Weston客户。如果您从串行控制台调用了Weston,请按Ctrl-C退出Weston。
也可以从本机控制台调用Weston,按Ctrl-Alt-Backspace退出Weston。

3.6.5.4. 使用IVI shell功能
SDK还支持配置Weston ivi-shell。SDK中配置的默认shell是desktop-shell。
要将shell更改为ivi-shell,用户必须将以下行添加到/etc/weston.ini文件中。
要切换回desktop-shell,可以在/etc/weston.ini文件中注释这些行(注释以’ # '开头)。

 [core]
shell=ivi-shell.so
modules=ivi-controller.so

[ivi-shell]
ivi-input-module=ivi-input-controller.so

完成上述配置后,我们可以通过运行以下命令重新启动Weston

target# /etc/init.d/weston stop
target# /etc/init.d/weston start

请注意
当Weston使用ivi-shell开始时,默认的背景是黑色的,这与desktop-shell打开带有背景的窗口是不同的。
通过为Weston配置ivi-shell, Wayland客户端应用程序使用ivi-application协议,由中央HMI窗口管理来管理。wayland-ivi-extension提供ivi-controller.so管理表面/层/屏幕的属性,它还提供了ivi-input-controller.so在一个表面上管理输入焦点。
应用程序必须支持由具有唯一数字ID的HMI中央控制器管理的ivi-application协议。
wayland-ivi-extension的一些重要参考资料可以在以下链接中找到:

• https://at.projects.genivi.org/wiki/display/WIE/01.+Quick+start
• https://at.projects.genivi.org/wiki/display/PROJ/Wayland+IVI+Extension+Design

3.6.5.4.1 使用IVI shell运行Weston的示例客户端应用程序
Weston包中的所有样例客户机应用程序,如weston-simple-egl, weston-simple-shm, weston-flower等,也都支持ivi-shell。SDK包括一个叫做layer-add-surfaces的应用程序,它是wayland-ivi-extension的一部分。这个应用程序允许用户调用ivi-shell的各种功能并控制应用程序。
下面是一系列命令的示例及其对目标器的影响。
使用vi-shell启动Weston后,请运行以下命令序列:

target# weston-simple-shm &

此时屏幕上什么也没有显示;还需要一些额外的命令.

target# layer-add-surfaces -l 1000 -s 2 &

这个命令创建一个ID为1000的图层,并在默认屏幕(通常是LCD)上为这个图层添加最多2个表面。
此时,用户可以看到weston-simple-shm在LCD上运行。这也打印numericID (surfaceID),客户端表面映射如下:

layer-add-surfaces: surface (10507) created
layer-add-surfaces: surface (10507) configured with:
    dst region: x:0 y:0 w:250 h:250
    src region: x:0 y:0 w:250 h:250
    visibility: TRUE
    added to layer (1000)
layer-add-surfaces: surface (10507) configured with:
    dst region: x:0 y:0 w:250 h:250
    src region: x:0 y:0 w:250 h:250
    visibility: TRUE
    added to layer (1000)

这里,10507是weston-simple-shm应用程序表面映射到的数字。
用户可以再启动一个客户端应用程序,它允许layer_add_surfaces添加第二个表面到1000层,如下所示.

target# weston-flower &

用户可以控制上述表面的属性使用LayerManagerControl如下所示,分别设置位置/大小,不透明度和可见性.

target# LayerManagerControl set surface 10507 destination region 150 150 300 300
target# LayerManagerControl set surface 10507 opacity 0.5
target# LayerManagerControl set surface 10507 visibility 1
target# LayerManagerControl  help

help选项用LayerManagerControl二进制文件打印所有可能的控制操作。请参考可用的选项.
3.6.5.4.2. 使用IVI shell运行QT应用程序
要使用ivi-shell运行QT应用程序,请将QT_WAYLAND_SHELL_INTEGRATION环境变量设置为ivi-shell。

export QT\_WAYLAND\_SHELL\_INTEGRATION=ivi-shell

3.6.6. 使用PowerVR工具
PowerVR工具套件旨在实现快速图形应用程序开发。它面向一系列领域,包括资产导出和优化、PC仿真、原型环境、在线和离线性能分析工具等。有关工具和详细文档的更多详细信息,请参阅PowerVR SDK。
目标文件系统包括PowerVR工具的子集,如PVRScope和PVRTrace recorder库,这些工具来自Imagination PowerVR SDK,用于分析和跟踪SGX活动。此外,它还包括PVRPerfServerDeveloper工具.
3.6.6.1。PVRTune
PVRTune是一款GPU实时性能分析工具。它捕获硬件计时数据和计数器,方便识别性能瓶颈。PVRPerfServerDeveloper应该与运行在PC上的PVRTune一起使用,以收集SGX加载和活动线程的数据。你可以用下面的命令调用这个工具:

target # /opt/img-powervr-sdk/PVRHub/PVRPerfServer/PVRPerfServerDeveloper

3.6.6.2. PVRTrace
PVRTrace是一个OpenGL® ES API记录和分析实用程序。PVRTrace GUI提供离线工具来检查捕获的数据、识别冗余调用、突出显示昂贵的着色器等等。默认文件系统包含用于获取图形应用程序的PVRTrace的助手脚本。然后可以使用PVRTrace实用程序在PC上回放此跟踪。
要开始跟踪,请使用以下命令作为参考:

target # cp /opt/img-powervr-sdk/PVRHub/Scripts/start_tracing.sh ~/.
target # ./start_tracing.sh <log-filename> <application-to-be-traced>

例子:

target # ./start_tracing.sh westonapp weston-simple-egl

上面的命令将执行以下操作:

  1. 设置跟踪所需的环境
  2. 在当前工作目录下创建一个名为pvrtrace的目录
  3. 启动用户指定的应用程序
  4. 开始跟踪PVR交互,同时将跟踪记录到当前目录下的文件
    要结束跟踪,用户可以调用Ctrl-C并显示跟踪文件路径。
    然后可以将跟踪文件传输到PC上,我们可以使用主机端PVRTrace实用程序对应用程序进行可视化。请参考PowerVR-SDK了解更多细节。
    [1]
    CRTC是阴极射线管控制器(阴极射线管控制器)的缩写,是对旧阴极射线管电视机的一种回归,它有一个控制器,根据由缓冲区提供的数据生成视频计时.

猜你喜欢

转载自blog.csdn.net/chocolate2018/article/details/113939424