AMD_pinned_memory - синхронизация перевода в текстуру - PullRequest
1 голос
/ 19 февраля 2012

Я только что прочитал следующую презентацию о 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? Нужно ли вызывать glClientWaitSync или glWaitSync непосредственно перед использованием текстуры или чего-то еще?

1 Ответ

1 голос
/ 19 февраля 2012

Мне известен ваш другой вопрос о хранении данных, записанных в отображенный буфер.Я думаю, что вы полностью неправильно поняли саму идею отображения буферов в OpenGL.Закрепленная память вам тоже не поможет, потому что даже с закрепленной памятью вам нужно синхронизироваться с OpenGL (прочитайте последнее предложение на странице 11 презентации, которую вы связали).Последняя, ​​но не менее важная память будет работать только на таких комбинациях CPU / GPU, как AMD Fusion.На обычных системах у вас есть узкое место PCI-E.

Относительно вашей первоначальной проблемы.Я думаю, что вы совершенно не понимаете, что делает glMapBuffer.Он отображает некоторую часть памяти GPU в адресное пространство ваших приложений.Это не похоже на обычную системную память.На самом деле это хорошая идея, чтобы сохранить копию оригинальных данных.На самом деле чтение из сопоставленного буфера будет иметь довольно плохую производительность, если только драйвер OpenGL не сделает копию данных для чтения.Подумайте об этом: каждый раз, когда вы отображаете этот буфер, данные должны копироваться из графического процессора.

Решение вашей проблемы простое: просто сохраните копию своих данных.Это не узкое место.И, может быть, glBufferSubData может быть даже лучше для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...