C++ 如何检查带有NULL的glBufferData是否已完成,以及glMapBuffer是否赢得';你不能阻止它吗?

C++ 如何检查带有NULL的glBufferData是否已完成,以及glMapBuffer是否赢得';你不能阻止它吗?,c++,opengl,C++,Opengl,我需要在应用程序启动时为PBO分配一个相当大的缓冲区(1GB),并按如下方式执行: glBufferData(GL\u像素\u解包\u缓冲区,新大小,0,GL\u流\u绘制) 我需要稍后映射缓冲区(使用glMapBuffer),以便开始向其写入数据。 问题是,如果我在glBufferData之后立即调用glMapBuffer,它会阻塞,因为它必须等待分配完成。因此,我想有一种方法来查询glMapBuffer现在是否可以立即返回,或者它是否仍然会阻塞,以便我的应用程序可以同时执行其他操作 有趣的是

我需要在应用程序启动时为PBO分配一个相当大的缓冲区(
1GB
),并按如下方式执行:

glBufferData(GL\u像素\u解包\u缓冲区,新大小,0,GL\u流\u绘制)

我需要稍后映射缓冲区(使用
glMapBuffer
),以便开始向其写入数据。 问题是,如果我在
glBufferData
之后立即调用
glMapBuffer
它会阻塞,因为它必须等待分配完成。因此,我想有一种方法来查询
glMapBuffer
现在是否可以立即返回,或者它是否仍然会阻塞,以便我的应用程序可以同时执行其他操作

有趣的是,围栏对象似乎在调用
glBufferData
后立即发出信号,因此它们似乎没有告诉我任何有用的信息

即使我这样做了

glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);
glFinish();
glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
暂停的是对
glMapBuffer
的调用,而不是
glFinish
。关于
glFlush
也是一样


我如何知道缓冲区(未指定数据)是否已完成分配并准备好映射?
glBufferData
可能返回时,我在规范中找不到。我猜这是一个基于给定缓冲区参数的供应商决策

但我发现:

如果未发生错误,则会显示指向映射范围开头的指针 在该缓冲区上的所有挂起操作完成后返回

由于分配所需大小可能是一个挂起的操作,因此CPU将等待
glMapBuffer
返回

同样在规范中,2.3.3齐平和饰面:

Finish在GL上执行此类命令的所有效果之前不会返回 完全实现了客户端和服务器状态以及帧缓冲区

请注意,它讲述的是状态和帧缓冲区,而不是任何其他缓冲区。因此,
glFinish
不能强制等待分配缓冲区


在您的情况下,我要做的是将所有第一个缓冲区创建和初始化放在一个线程中。在该线程中,在
glMapBuffer
返回后,立即向应用程序发送一条消息(或更改某些标志),意思是“指向GPU的解包数据指针已准备就绪”。
数据上传可以在不同的线程中完成。不要忘记将调用gl命令的线程的gl上下文设置为当前。

“以便我的应用程序可以同时执行其他任务”如果您有其他任务可以执行,您应该只执行该任务,稍后再执行。