2017-01-12 2 views
1

По какой-то причине мне приходится копировать текстуры в буфер, а затем снова загружать их в текстуру. Исходная текстура - это тот, что исходит от декодера, целевая текстура - та, которая будет отображаться. Самый простой способ сделать это (как я понимаю) это сделать следующее:Быстрый способ копирования и из Texture2D

  1. декодер текс (ID3D11Texture2D)
  2. Использование температуры текстуры (Usage = D3D11_USAGE_STAGING)
  3. CopyResource на временную текстуру
  4. 'Карта'
  5. memcpy _s в буфер
  6. Unmap

на другой стороне она идет обратный

  1. Используйте временную текстуру (Usage = D3D11_USAGE_STAGING)
  2. Map
  3. memcpy_s из буфера
  4. Unmap
  5. CopyResource чтобы рендерер текстуры

Работает отлично, однако у меня есть ощущение, что я не делаю это как можно эффективнее (в отличие от того, что я копирую данные взад и вперед) Должен ли я использовать промежуточную текстуру? Могу ли я настроить фильтры текстуры декодера/рендеринга (BindFlags?) Или перечисление D3D11_MAP карты, чтобы пропустить копирование в промежуточную текстуру?

EDIT001: Хорошо, здесь идет корпус с техническими деталями. Существует декодер, по сути, это декодер Intel Media SDK, который декодирует (каламбур) данные, предоставленные вне класса декодирования. Таким образом, он получает буфер, делает свою магию (асинхронно) и возвращает (с помощью SyncOperation, если я помню имя метода справа) поверхность, которая на самом деле находится под текстурой DX капота, управляемой распределителем Intel. Я получаю и копирую текстуру синхронно, но, я думаю, с небольшим усилием я могу сделать это асинхронно. Поверхность происходит из пула, поэтому работа с текстурой не останавливает декодер, чтобы продолжить работу. Скопированные данные хранятся в структуре, которая хранится в кольцевом буфере, откуда подается видеорезерент. Именно так, к моему пониманию (немного, я должен заметить), нет никакого вреда для параллелизма GPU.

+0

Подождите, выполняете ли вы обработку процессора по текстуре? Если нет, вы можете просто «CopyResource» между двумя текстурами графического процессора, без необходимости временного размещения. – galop1n

+0

nope, вся обработка, выполненная с использованием Intel Media SDK, декодирования и VPP, только окончательный результат копируется в средство визуализации (через циклический буфер). – kreuzerkrieg

ответ

3

Если вам нужно читать и писать обратно, нет быстрого пути, вы нарушаете параллелизм графического процессора и процессора, заставляя точку синхронизации, и вы создадите много незанятых пузырей на процессоре и графическом процессоре.

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

Для выполнения, вы должны рассмотреть следующие вопросы:

  1. Адаптировать технику быть GPU только
  2. Если считан это единственный путь, предел части, загрязнен или необходимыми
  3. Попробуйте работать с пару текстур в рамке, чтобы процессор работал над версией, которая представляет собой несколько кадров для защиты параллелизма.
+0

Ага ... все становится понятным ... У меня есть пара вопросов. Во-первых, в данном конкретном случае речь идет об Intel GPU, о том, что он умирает, поэтому, я думаю (как я понимаю, как работает материал), накладных расходов слишком много, так как Intel GPU не является дискретной картой, имеют свою собственную память, поэтому все копии находятся в одной и той же памяти и проходят через тот же менеджер памяти, что и процессор. Я прав? – kreuzerkrieg

+0

Во-вторых, ваше заявление «временный ресурс для назад и вперед необходим», что ясно, но сколько временных я нуждаюсь? в данный момент у меня есть 3 ресурса (2 темп-текстуры и один буфер), который дает мне 4 копии. все они необходимы? И последнее, но не менее важное, пункт 3, что вы подразумеваете под «текстурой на кадре, чтобы позволить процессору работать над версией, которая представляет собой несколько кадров для защиты параллелизма» – kreuzerkrieg

+0

Даже на интегрированном чипе Intel, использующем основную память, это другой тип доступа к памяти (кэшированный/неэкранированный/записываемый вместе) плюс потенциальный скрытый swizzling и tiling, а API D3D11 не предназначен для того, чтобы вы знали что-либо о внутренних компонентах, так что да, вы должны сохранить 3. – galop1n

Смежные вопросы