[GLES] glMapBufferRange 参数

hi,这边看 TOpenGLBuffer 的更新(Lock)相关的代码(OpenGLResources.h),如下

当使用 FOpenGL::MapBufferRange 配合 FOpenGL::EResourceLockMode::RLM_WriteOnly 进行更新时
底层走的是  GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT
有了 GL_MAP_UNSYNCHRONIZED_BIT 标签后,如果buffer正在被gpu使用,有没有可能会导致错误(因为修改了gpu正在使用的buffer)
还是说UE上层可以保证,lock时,gpu已经不使用这块buffer了

<br/>

Ref: https://registry.khronos.org/OpenGL\-Refpages/es3\.0/html/glMapBufferRange.xhtml

<br/>

具体代码如下:

uint8 *TOpenGLBuffer::Lock(uint32 InOffset, uint32 InSize, bool bReadOnly, bool bDiscard)
{
  if ( bUseMapBuffer)
          {
              FOpenGL::EResourceLockMode LockMode = bReadOnly ? FOpenGL::EResourceLockMode::RLM_ReadOnly : FOpenGL::EResourceLockMode::RLM_WriteOnly;
              Data = static_cast<uint8*>( FOpenGL::MapBufferRange( Type, InOffset, InSize, LockMode ) );
          }
  }
注意到 OpenGLES.h 中
static FORCEINLINE void* MapBufferRange(GLenum Type, uint32 InOffset, uint32 InSize, EResourceLockMode LockMode)
    {
        GLenum Access;
        switch (LockMode)
        {
        case EResourceLockMode::RLM_WriteOnly:
            Access = (GL_MAP_INVALIDATE_BUFFER_BIT | GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
            break;
        case EResourceLockMode::RLM_WriteOnlyUnsynchronized:
            Access = (GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
            break;
        }
        return glMapBufferRange(Type, InOffset, InSize, Access);
    }

您好,

感谢您的询问。

在虚幻引擎里,对 Buffer 的访问会被推迟到 RHI 线程上,RHI 线程是和 GPU 有正确同步的。类似更新 Uniform Buffer 等的操作会通过 Render Graph 进行,需要通过临时缓冲进行暂存,这些操作应该也是进行了同步的。由于 OpenGL 不是一个显式 API,它的很多行为是由具体实现决定的。推荐您查询您的硬件/操作系统提供商的相关文档。

请问您有遇上什么可能由 Buffer 映射同步导致的具体问题吗?您可以也提供一下目前使用的引擎 CL 版本吗?在虚幻引擎 5.6 中,应该有一个新增的 OpenGL.UseUnsynchronizedBufferMapping 选项可以控制您提到的这个同步行为(CL 33794433)。

如果您有更多疑问,请随时联系我们。

没,我是对这里的 TOpenGLBuffer::Lock 中 FOpenGL::MapBufferRange 使用 GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT 标签有点疑问

不知道UE这里是怎么正确控制 CPU上写入GPU正在读的buffer

您好,

请问之前回复中的信息对您有帮助吗?如果这些信息解答了您的疑问的话,我们现在可以关闭这个工单吗?

如果您对于这个问题需要更多帮助,可以随时重新开启这个工单。

好​,感谢