我将图片数据上传到GL纹理asynchronously。
在调试输出中,我在渲染过程中收到这些警告:
来源:OpenGL,类型:其他,id:131185,严重性:通知
消息:缓冲区详细信息:缓冲区对象1(绑定到 GL_PIXEL_UNPACK_BUFFER_ARB,用法提示为GL_DYNAMIC_DRAW) 在SYSTEM HEAP内存中映射WRITE_ONLY(快速)。来源: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;
然后我只是将结果blit到默认帧缓冲区。没有几何体的渲染或类似的东西。
glBlitNamedFramebuffer(
mCopyFBO,
0,//default FBO id
0,
0,
mViewportSize.x,
mViewportSize.y,
0,
0,
mViewportSize.x,
mViewportSize.y,
GL_COLOR_BUFFER_BIT,
GL_LINEAR);
在NVIDIA GTX 960卡上运行。
答案 0 :(得分:4)
此性能警告是特定于nividia的,它旨在告诉您,您不会使用单独的hw传输队列,这也就是难怪,因为您使用单个线程,单个GL上下文模型,在这里进行渲染(至少是你的blit)和传输。
有关nvidia如何处理此问题的详细信息,请参阅this nvidia presentation。第22页还解释了这一具体警告。请注意,此警告不意味着您的传输不是异步的。它仍然与CPU线程完全异步。它将在GPU上同步处理,与同一命令队列中的渲染命令相关,并且您不使用异步复制引擎,它可以在单独的命令中独立于渲染命令执行这些复制队列中。
我无法在我的案例中看到任何错误的公益组织使用或任何错误。所以问题是,如果这些警告可以放弃,或者我实际上做错了。
您的PBO使用没有任何问题。
目前尚不清楚您的特定应用程序是否可以从使用更复杂的单独传输队列方案中受益。