Как я могу скомпилировать asm-шейдер в файл fxo? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть скомпилированный шейдер fxo, который я пытаюсь немного отредактировать (просто настраиваю некоторые константы).

Используя fxdis (https://code.google.com/archive/p/fxdis-d3d1x/) Я могу разобрать этот шейдер, это вывод:

# DXBC chunk  0: RDEF offset 52 size 972
# DXBC chunk  1: ISGN offset 1032 size 80
# DXBC chunk  2: OSGN offset 1120 size 44
# DXBC chunk  3: SHEX offset 1172 size 1592
# DXBC chunk  4: STAT offset 2772 size 148
ps_5_0
dcl_global_flags refactoringAllowed
dcl_constant_buffer cb0[30].xyzw, immediateIndexed
dcl_sampler sampler[0]
dcl_resource_texture2d resource[0]
dcl_resource_texture2d resource[1]
dcl_resource_texture2d resource[2]
dcl_input_ps linear v1.xy
dcl_output o0.xyzw
dcl_temps 5
ne r0.x, l(0, 0, 0, 0), cb0[29].y
mov r1.x, v1.x
add r2.xz, -v1.yyxy, l(1, 0, 1, 0)
eq r0.yzw, cb0[29].yyxz, l(0, 1, 1, 1)
movc r1.y, r0.y, r2.x, v1.y
add r2.y, -r1.y, l(1)
movc r0.xy, r0.xxxx, r2.yzyy, r1.xyxx
sample r1.xyzw, r0.xyxx, resource[1].xyzw, sampler[0]
sample r2.xyzw, r0.xyxx, resource[2].xyzw, sampler[0]
mad r0.xy, r1.zxzz, l(255, 255, 0, 0), r1.wyww
mad r0.xy, r0.xyxx, l(0.0078125, 0.0078125, 0, 0), l(-1, -1, 0, 0)
mul r0.y, r0.y, cb0[28].z
mad r1.x, -r0.x, cb0[28].y, l(1)
add r0.x, r0.x, cb0[28].y
div r0.xy, r0.xyxx, r1.xxxx
ge r1.x, l(1), r0.y
ge r1.y, r0.y, l(-1)
div r0.y, r0.y, cb0[28].x
and r1.x, r1.y, r1.x
ge r1.y, l(1), r0.x
and r1.x, r1.y, r1.x
ge r1.y, r0.x, l(-1)
div r0.x, r0.x, cb0[28].x
add r0.xy, r0.xyxx, l(1, 1, 0, 0)
and r1.x, r1.y, r1.x
and r1.x, r1.x, l(1065353216)
mul r1.y, r0.x, l(0.5)
mad r0.x, -r0.x, l(0.5), l(1)
movc r0.x, r0.z, r1.y, r0.x
add r0.z, -r0.x, l(1)
movc r3.y, r0.w, r0.z, r0.x
mul r3.x, r0.y, l(0.5)
add r3.x, r3.x, l(0.5)
sample r4.xyzw, r3.xyxx, resource[0].xyzw, sampler[0]
mul r1.xyzw, r1.xxxx, r4.xyzw
mul r1.xyzw, r2.xyzw, r1.xyzw
ge r0.x, l(2), r0.y
ge r0.y, r0.y, l(0)
and r0.x, r0.y, r0.x
ge r0.y, r3.y, l(0)
ge r0.z, l(1), r3.y
and r0.x, r0.y, r0.x
and r0.x, r0.z, r0.x
and r0.x, r0.x, l(1065353216)
mul o0.xyzw, r0.xxxx, r1.xyzw
ret

Я понимаю сборку и могу ее редактировать. Проблема в том, что я в настоящее время не знаю, как я могу скомпилировать это обратно в файл FXO. Кажется, fxc.exe из Windows SDK не принимает файлы asm-шейдеров. Или я что-то пропускаю?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

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

Это хорошая ссылка для начала работы: синтаксический анализ байт-кода

Восстановление байт-кода путем изменения операндов является довольно утомительной задачей, но в вашем случае, если вам требуется только изменить несколько констант, вы, вероятно, можете использовать информацию синтаксического анализа для прямой замены константного двоичного значения (в вашем случае вам не нужно перестройте чанки, так как замена константы не добавляет / удаляет новые инструкции).

В вашем сценарии вам нужно перейти в блок SHDR (блок шейдера), сначала найти операнд, содержащий константу, которую вы хотите изменить, например:

add r2.y, -r1.y, l(1)

и измените двоичное значение l (1) на l (хотите, чтобы вы хотели)

Описание операндов есть в Windows Driver Kit (файл d3d11TokenizedProgramFormat.hpp)

Вам также понадобится изменить хэш / контрольную сумму, сгенерированную в dxbc, в противном случае вызовите

device->CreateXShader 

потерпит неудачу.

Контрольная сумма описана здесь

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

Как упомянул Чак, dx12 также имеет новый компилятор на основе llvm с открытым исходным кодом, который значительно упростит эти операции, но это немного выходит за рамки ваших возможностей, так как шейдеры, которые вы хотите изменить, уже являются dxbc (и, похоже, планов нет). иметь поддержку dx11 dxil, что очень жаль).

0 голосов
/ 27 апреля 2018

Создание шейдеров из сборки не поддерживается . В устаревших DirectX SDK для Shader Model 1.1 - 3.0 были старые инструменты сборки DirectX VSA и PSA. Последний раз они были отправлены в DirectX SDK (ноябрь 2008 г.), задолго до окончания срока действия DirectX SDK (июнь 2010 г.) 1006 *.

.

Кроме того, для Shader Model 4.x и 5.x среда выполнения DirectX не будет принимать шейдерный BLOB-объект, который не подписан с правильным хешем, поэтому двоичные правки шейдерного объекта не загружаются. Только официальный HLSL-компилятор может создать допустимый шейдерный BLOB-объект для DirectX 10.x или DirectX 11.

Выходные данные дизассемблера поддерживаются, а язык ассемблера шейдеров задокументирован на MSDN для облегчения оптимизации шейдеров HLSL, отладки самого компилятора HLSL и для помощи в отладке шейдеров в приложениях.

Для DirectX 12 и новых инструментов Shader Model 6.x см. GitHub

...