2014-01-22 5 views
0

я собираюсь добавить поддержку Compute Shader моих кодовые и имеющие проблемы с поиском ответов на некоторые довольно основные вопросы:Compute Shader основы в DX11

  1. Вся документация там говорит, что трубопровод Compute Shader работает независимо от GPU, однако все образцы кода dx11 используют контекстный интерфейс устройства для установки самого шейдера, представлений ресурсов и вызова метода dispatch(), поэтому они попадают в очередь в командном буфере с остальными командами рендеринга или они выполняются независимо?

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

  3. Синхронизация. В большинстве статей используется команда CopyResource, которая будет автоматически синхронизировать завершение выполнения вычисляемого шейдера и предоставить доступ к ЦП для результатов, но похоже, что это также заблокировало бы GPU. Есть ли более эффективный способ синхронизации?

Я знаю, что могу найти ответы на это, экспериментируя, но любая помощь, которая экономит мне время, будет оценена по достоинству.

ответ

2
  1. Трубопровод Compute Shader работает независимо от трубопровода в Rendering, то есть вершинные шейдеры, пиксельные шейдеры, смесь состояний и т.д. не оказывают никакого влияния на то, что происходит, когда вы звоните Dispatch(). Однако они переходят в одну очередь, поэтому порядок между вызовами Draw и Dispatch сохранен.

  2. Все вызовы в непосредственный контекст должны выполняться из одного потока.

  3. Один общий подход заключается в использовании двух буферов. В то время как один из них работает с вычислительным шейдером, другой копируется и считывается процессором. Большинство графических процессоров смогут распараллелить это.

+0

Я вижу, так что происходит, когда я называю Present()? Соответствует ли конвейер Compute Shader таким же, как конвейер рендеринга? Значение – Rincer

+0

Я вижу, так что произойдет, если у меня есть очередь вычислений в очереди, и я вызываю Present()? Будет ли он останавливаться, пока вычислительный шейдер не завершит выполнение? В принципе, возможно запустить вычислительный шейдер, который охватывает многострочные рамки рендеринга? – Rincer

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