Налагает ли DXC ограничения на условные выражения и вызовы TraceRay () в HLSL трассировки лучей? - PullRequest
0 голосов
/ 21 февраля 2019

В программе DX12 у меня есть шейдер с ближайшим эффектом, и передача dxc.exe в VS2017 (15.9.7) выдает мне следующую ошибку при компиляции:

1>------ Build started: Project: Raymond, Configuration: Debug x64 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets(1327,5): error MSB6006: "dxc.exe" exited with code -1073741571.
1>Done building project "Raymond.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

Для чего это стоит (вероятно, нет)много), строки в файле, который он упоминает в сообщении об ошибке:

1327    <FXC
1328        Condition                       = "'@(FxCompile)' != '' and '%(FxCompile.ExcludedFromBuild)'!='true'"
1329        Source                          = "%(FxCompile.Identity)"
1330        ToolPath                        = "$(FXCToolPath)"

Ошибка, как представляется, наиболее зависит от включения вызова встроенной функции DX12 TraceRay (), которая находится вфункция-обертка TraceRadienceRay ():

#if 1
      float4 ambient = TraceRadianceRay(ambientRay, rayPayload.recursionDepth, rayPayload.sample_ID, rayPayload.medium_stack);
#else
      float4 ambient = { 0, 0, 0, 0 };
#endif

При значении #if, равном 1, я получаю сообщение об ошибке.Установите в 0, он компилируется нормально.Нет ничего плохого в этой конкретной строке кода.Шейдер использовался для компиляции, но по мере его роста (теперь он составляет около 360 строк), ошибка начала увеличиваться по частоте.Что действительно странно, так это то, что вероятность получения ошибки находится где-то между 0 и 1. Иногда происходит сбой, но если я просто скомпилирую снова, это работает!Кажется, существует корреляция между вероятностью отказа и количеством / уровнем условных предложений в коде.Теперь я просмотрел код и свел его к минимуму, но я не могу уменьшить сложность кода, не удалив функциональность.

Я просмотрел ограничения шейдеров в Интернете, и похоже, чтоограничения для таких вещей, как количество локальных переменных и условных предложений, но все эти ограничения в Shader Model 6.0 намного выше того, что есть в моем коде.

Я попытался найти возвращаемое значение, но ни одно изресурсы, которые я нашел, имеют этот код возврата.Если вы превратите значение в шестнадцатеричное значение, вы получите 0xFFFF_FFFF_C000_00FD, но это не соответствует какой-либо документации, даже если вы удалите все буквы F.

Кажется, что с dxc.exe очень мало что можно сделать- поиск Google обнаруживает очень мало хитов.Действительно надеясь, что кто-то здесь видел нечто подобное и может пролить свет на это.

Большое спасибо.

1 Ответ

0 голосов
/ 21 июня 2019

Я подписался на SO, просто чтобы сказать вам, что у меня тоже есть эта проблема.Я видел это периодически с незначительными изменениями кода, которые, кажется, не имеют явного синтаксиса или ошибок использования.Хотя я также работаю с шейдерами и Ray Tracing, ошибка, которую я получаю сейчас, связана с функцией, которая содержит довольно ванильный оператор switch / case.

Я только что перешел с сборки Debug на сборку Release иэто скомпилировано.Вы пробовали что-то подобное?

Не совсем решение, но оно позволило мне обойти ошибку.Дайте мне знать, если у вас есть успех.

...