我需要在应用程序启动时为PBO分配一个相当大的缓冲区(1 GB
),并这样做:glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);
之后,我需要立即映射缓冲区(使用glMapBuffer
),以便开始向其中写入数据。
问题是,如果我在glMapBuffer
之后立即调用glBufferData
,会阻止,因为它必须等待分配完成。因此,我想提供一种方法来查询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
可能返回时,我在规范中找不到。我猜这是基于缓冲区给定参数的供应商决定。
但是我在OGL 4.6 spec. 6.3 Mapping ...找到:
由于分配所需的大小可能是挂起的操作,因此CPU将等待glMapBuffer
返回。
同样在规范中,2.3.3冲洗并完成:
请注意,它讲述状态和帧缓冲区,而不是其他缓冲区。因此,无需强制glFinish
等待分配缓冲区。
在您的情况下,我要做的就是将所有第一个缓冲区的创建和初始化都放在一个线程中。在此线程中,在glMapBuffer
返回之后,立即向应用发送一条消息(或更改一些标志),表示“将数据解压缩到GPU的指针已准备就绪”。
数据上传可以在其他线程中完成。不要忘记将gl-context设置为调用gl-commands的线程的当前值。
关于c++ - 如何检查带有NULL的glBufferData是否已完成以及glMapBuffer是否不会对其阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50331985/