gpt4 book ai didi

c++ - 如何检查带有 NULL 的 glBufferData 是否已完成以及 glMapBuffer 是否不会阻塞?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:56 29 4
gpt4 key购买 nike

我需要在应用程序启动时为 PBO 分配一个相当大的缓冲区(1 GB),并且这样做:

glBufferData(GL_PIXEL_UNPACK_BUFFER, new_size, 0, GL_STREAM_DRAW);

我需要在不久之后映射缓冲区(使用 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 的调用,而不是 glFinishglFlush 也是如此。

我如何知道未指定数据的缓冲区是否已完成分配并准备好映射?

最佳答案

我在规范中找不到 glBufferData 可能返回的时间。我想这是供应商根据缓冲区的给定参数做出的决定。

但我在 OGL 4.6 spec. 6.3 Mapping ... 找到:

If no error occurs, a pointer to the beginning of the mapped range is returned once all pending operations on that buffer have completed

因为分配所需的大小可能是一个挂起的操作,所以 CPU 将等待直到 glMapBuffer 返回。

同样在规范中,2.3.3 Flush and Finish:

Finish does not return until all effects from such commands on GL client and server state and the framebuffer are fully realized.

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


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

关于c++ - 如何检查带有 NULL 的 glBufferData 是否已完成以及 glMapBuffer 是否不会阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331985/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com