GLES 的PSO 是否支持 ComputeShader

hi,

这边看代码,似乎 GLES 的PSO不支持ComputeShader,想这边确认一下。如果支持的话,相关在代码在哪里呢

Hi,

GLES本身是支持Compute Shader的,有些GlobalShader就是用Compute Shader写的。请问你是想问PSO pipeline cache是否支持Compute Shader吗?​如果是的话,可以看一下r.ShaderPipelineCache.DoNotPrecompileComputePSO, 默认Android平台是False。我个人觉得是因为有很多Niagara的Compute Shader,在一些Android设备上编译会失败,不过这通常跟具体的Niagara有关系,所以可以尽量避免使用GPU simulation的Niagara,然后打开这个功能。

应该是可以Cache下来的,你可以看一下LinkComputeProgram,FOpenGLProgramBinaryCache::CheckSinglePendingGLProgramCreateRequest,和UE::OpenGL::OnGLProgramLoadedFromBinaryCache函数,应该就是这个流程。

  1. 是想问GLES的PSO pipeline cache是否支持Compute Shader(特指PSO预编译后,通过glGetProgramBinary把Binary存到本地,下次再碰到同一个shader,通过glProgramBinary结合Binary把Program创建出来,跳过编译&链接)
  2. 这边捋代码发现,GLES上 ComputeShader的预编译流程是:FShaderPipelineCacheTask::Precompile() --> PipelineStateCache::GetAndOrCreateComputePipelineState() --> FDynamicRHIPSOFallback::RHICreateComputePipelineState(),后面没有通过glGetProgramBinary把Binary存到本地。这边看捋的代码是否正确

这条调用路径是可以的

预编译流程里面不包含​LinkComputeProgram,目前项目里面还是先收集PSO,启动的时候触发预编译(FShaderPipelineCacheTask::Precompile),把所有收集的pso都通过glGetProgramBinary把Binary存到本地,下次再碰到同一个shader,通过glProgramBinary结合Binary把Program创建出来,跳过编译&链接

是的,就是这个过程。