我将图像数据异步上传到GL纹理中。
在调试输出中,我在渲染过程中收到以下警告:
来源:OpenGL,类型:其他,ID:131185,严重性:通知
消息:缓冲区详细信息:缓冲区对象1(绑定到GL_PIXEL_UNPACK_BUFFER_ARB,使用提示为GL_DYNAMIC_DRAW)已映射到WRITE_ONLY(快速)在SYSTEM HEAP内存中。来源:OpenGL,类型:性能,ID:131154,严重性:中消息:像素路径性能警告:像素传输与3D渲染同步。
我看不到任何错误使用PBO的情况或任何错误,所以问题是,这些警告是否可以安全丢弃,或者我实际上做错了什么。
我的那部分代码:
//start copuying pixels into PBO from RAM:
mPBOs[mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);
const uint32_t buffSize = pipe->GetBufferSize();
GLubyte* ptr = (GLubyte*)mPBOs[mCurrentPBO].MapRange(0, buffSize, GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
if (ptr)
{
memcpy(ptr, pipe->GetBuffer(), buffSize);
mPBOs[mCurrentPBO].Unmap();
}
//copy pixels from another already full PBO(except of first frame into texture //
mPBOs[1 - mCurrentPBO].Bind(GL_PIXEL_UNPACK_BUFFER);
//mCopyTex is bound to mCopyFBO as attachment
glTextureSubImage2D(mCopyTex->GetHandle(), 0, 0, 0, mClientSize.x, mClientSize.y,
GL_RGBA, GL_UNSIGNED_BYTE, 0);
mCurrentPBO = 1 - mCurrentPBO;
Run Code Online (Sandbox Code Playgroud)
然后我只是将结果映射到默认的帧缓冲区。没有渲染几何图形或类似的东西。
glBlitNamedFramebuffer(
mCopyFBO,
0,//default FBO id
0,
0,
mViewportSize.x,
mViewportSize.y,
0,
0,
mViewportSize.x,
mViewportSize.y,
GL_COLOR_BUFFER_BIT,
GL_LINEAR);
Run Code Online (Sandbox Code Playgroud)
在NVIDIA GTX 960卡上运行。
此性能警告是 nividia 特定的,它旨在提示您不会使用单独的硬件传输队列,这也难怪,因为您使用单线程、单 GL 上下文模型,其中两个渲染(至少你的 blit)和转移被执行。
有关nvidia如何处理此问题的一些详细信息,请参阅此 nvidia 演示文稿。第 22 页还解释了此特定警告。请注意,这warnign并不能意味着你的转移是不同步的。它仍然与 CPU 线程完全异步。对于同一命令队列中的渲染命令,它只会在 GPU 上同步处理,并且您没有使用异步复制引擎,该引擎可以独立于单独命令队列中的渲染命令执行这些复制。
在我的案例中,我看不到 PBO 的任何错误用法或任何错误。所以问题是,如果这些警告可以安全地丢弃,或者我实际上做错了什么。
您的 PBO 使用没有任何问题。
不清楚您的特定应用程序是否可以从使用更精细的单独传输队列方案中受益。