gpt4 book ai didi

c++ - AMD_pinned_memory - 同步传输到纹理

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:16 32 4
gpt4 key购买 nike

我刚刚阅读了以下内容 presentation关于 AMD_pinned_memory。

但是我对同步传输有疑问。

当将数据从缓冲区复制到纹理时,他们显示了以下示例(第 12 页):

将缓冲区中的数据复制到纹理中

// Bind buffer as unpack buffer to copy data into a texture object
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, m_pBuffer[m_uiBufferIdx]);
// Copy pinned memory to texture
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_uiTexWidth, m_uiTexHeight, m_nExtFormat, m_nType, NULL);
// Insert Sync object to check for completion
m_UnPackFence= glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);

我何时以及如何等待 m_UnPackFence?我是否需要在使用纹理或其他东西之前调用 glClientWaitSyncglWaitSync

最佳答案

我知道您关于将数据写入映射缓冲区的其他问题。我认为您完全误解了 OpenGL 中映射缓冲区的整个想法。固定内存也不会对您有所帮助,因为即使固定了内存,您也需要与 OpenGL 同步(请阅读您链接的演示文稿第 11 页的最后一句话)。最后但并非最不重要的一点是,固定内存只能在 AMD Fusion 等 CPU/GPU 组合上发挥性能。在常规系统上,您会遇到 PCI-E 瓶颈。

关于您的原始问题。我认为您完全误解了 glMapBuffer 的作用。它将 GPU 内存的一部分映射到您的应用程序地址空间。这不像常规系统内存。事实上,保留原始数据的拷贝是个好主意。事实上,从映射缓冲区中读取数据的性能会很差,除非 OpenGL 驱动程序制作数据拷贝供您读取。想一想:每次映射该缓冲区时,都必须从 GPU 复制数据。

您的问题的解决方案很简单:只需保留一份数据拷贝即可。这不是瓶颈。也许 glBufferSubData 可能更适合您。

关于c++ - AMD_pinned_memory - 同步传输到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350581/

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