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);
}