我刚刚阅读了有关AMD_pinned_memory的以下presentation

但是我有一个关于同步传输的问题。

将数据从缓冲区复制到纹理时,它们显示以下示例(第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页的最后一句话)。最后但并非最不重要的一点是,固定内存仅在CPU / GPU组合(如AMD Fusion)上有效。在常规系统上,您会遇到PCI-E瓶颈。

关于你原来的问题。我认为您完全误解了glMapBuffer的作用。它将GPU内存的一部分映射到您的应用程序地址空间。这与常规系统内存不同。实际上,最好保留原始数据的副本。实际上,除非OpenGL驱动程序为您读取要复制的数据,否则从映射的缓冲区读取将具有非常差的性能。考虑一下:每次映射该缓冲区时,都必须从GPU复制数据。

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

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

10-12 02:59
查看更多