二进制调色器程序管理

二进制调色器程序管理

 

自动调色器缓存

比较与组合

调色器程序通常以源代码形式存储,并在应用程序通过调用OpenGL ES API首次使用时,由OpenGL ES驱动程序进行编译和链接。

还可以使用离线调色器编译器glslc预编译调色器程序。这样就无需在运行时编译那些调色器程序。如果应用程序使用的所有调色器程序均已预编译,则OpenGL ES驱动程序,可以通过根本不加载编译器库来节省更多时间和资源。

应用程序还可以直接控制二进制程序管理。它可以使用OpenGL ES 3.0中添加的glGetProgramBinary()函数,来读取任何已编译和链接的程序的二进制文件,并存储它们以备后用。该glProgramBinary()函数加载这些保存的二进制文件。与OpenGL ES 2.0中的glShaderBinary()函数不同,glProgramBinary()在链接的程序上运行,而不是在单个顶点和片段调色器上运行,因此在加载二进制文件后无需执行其它链接步骤。

应用程序可以直接通过调用OpenGL ES API或通过下面描述的自动调色器缓存来保存和加载已编译的程序二进制文件。

自动调色器缓存

L4T中的OpenGL ES 3.0驱动程序支持NVIDIA专有的调色器缓存。启用调色器缓存支持时,驱动程序将维护每个程序的调色器缓存文件。如果应用程序请求调色器,则驱动程序会在高速缓存中,搜索从该源编译的二进制文件,其中包含编译器和驱动程序的当前版本。如果存在这样的二进制文件,它将从缓存中加载该二进制文件。否则,它将编译程序并将二进制文件保存在缓存中。

缓存在应用程序运行之间保持不变,因此,在进行彻底的初始运行之后,仅在安装新的驱动程序时才需要编译程序。

默认情况下,在读/写文件系统上启用调色器缓存。将环境变量__GL_SHADER_DISK_CACHE分配为0以禁用高速缓存。

默认情况下,缓存位于〜/.nv中。如果该目录尚不存在,则创建该目录。通过将环境变量__GL_SHADER_DISK_CACHE_PATH设置为目录的路径名,可以为缓存指定其它位置。如果指定的目录不存在,驱动程序将禁用缓存;否则,驱动程序将禁用缓存。它不会像默认的〜/.nv目录那样创建丢失的目录。

无论将缓存保留在何处,它都采用名为GLCache的子目录的形式。它包含一组带有哈希名称的文件。这些文件对驱动程序版本,GPU和应用程序进行编码。每当安装新版本的驱动程序时,哈希名称都会更改。然后,用户可能希望在运行应用程序之前删除旧目录。

可以将应用程序的调色器缓存设为只读。这样的缓存仅包含预编译的调色器程序二进制文件;OpenGL ES驱动程序在运行时对其进行编译时,无法在其中保存二进制文件。

将缓存设为只读

l  在文件系统具有写访问权的测试或开发系统上运行应用程序。

l  将缓存目录复制到目标映像中的所需位置。

l  设置缓存目录的权限,以授予应用程序只读访问权限。

l  设置上述环境变量以启用缓存并指定其位置。

比较与组合

使用调色器缓存的主要优点是对应用程序透明地自动处理它。此外,驱动程序有时会在内部为某些清除和复制操作生成调色器,并且如果启用了缓存,这些调色器也只会生成一次,而不是在应用程序每次运行时生成。

尽管缓存消除了重新编译调色器的需要,但是它具有一些搜索和维护开销。应用程序可以通过直接保存和加载调色器程序二进制文件来避免这种开销。此外,每次安装新的驱动程序时都会重新编译缓存的二进制文件,而仅当更新驱动程序的编译器部分时才需要替换保存的二进制文件。

应用程序可以将某些调色器程序保留在缓​​存中,并直接加载其它调色器程序。例如,应用程序可以对最关键的调色器程序使用直接加载,启动后必须尽快将其加载,并依靠缓存来管理不那么频繁使用的调色器。

人工智能芯片与自动驾驶
原文地址:https://www.cnblogs.com/wujianming-110117/p/14204649.html