Указание смещения блока констант push в HLSL

Я пытаюсь написать средство визуализации Vulkan, использую glslangValidator с HLSL для шейдеров и пытаюсь реализовать push-константы.

[[vk::push_constant]]
cbuffer cbFragment {
    float4 imageColor;
    float4 aaaa;
};
 
[[vk::push_constant]]
cbuffer cbMatrices {
    float4 bbbb;
};

Аннотация [[vk::push_constant]] работает, я использую spirv_reflect для отражения, и обе константы push отображаются и работают как положено. Проблема, с которой я сталкиваюсь, заключается в том, что они, по-видимому, перекрываются, если я назначаю bbbb значение, imageColor изменяется точно так же, и наоборот. В данных отражения оба блока push-константы имеют смещение 0, что объясняет проблему. Однако я, кажется, совершенно не могу изменить смещение любой из констант push. [[vk::offset(x)]] вообще не работает, он не влияет ни на смещения отдельных элементов, ни на смещение констант push. Единственное смещение, которое вообще работает, — это встроенное в HLSL смещение пакета, которое применяется только к элементам буфера. И хотя на самом деле может быть решением просто сместить члены одной из push-констант так, чтобы они находились за пределами диапазона другой, я вряд ли верю, что это может быть разумным решением, поскольку это также приводит к сбою уровня проверки из-за смещения отдельных просто без необходимости увеличивает размер push-константы, а само перекрытие все еще присутствует.

Я был бы очень признателен за любую помощь в этом вопросе и готов предоставить любые необходимые разъяснения, большое спасибо!


person Salvage    schedule 22.02.2021    source источник


Ответы (1)


Push-константы живут в одном фрагменте непрерывной памяти. Компилятор не пытается добавлять в эту память несколько блоков; как и в случае с синтаксисом GLSL, он предназначен чтобы иметь только один блок, содержащий все данные push-константы.

Это согласуется с другими местами, где компилятор должен упаковывать переменные в блок: он упаковывает только внутри блока, а не между несколькими блоками. Два отдельных буфера, не поддерживающих push-константы, будут ссылаться на два разных буфера в памяти, содержимое которых начинается с нулевого смещения в их индивидуальном буфере. Есть только один буфер push-констант, поэтому вы должны декорировать только один cbuffer с помощью vk::push_constant.

person Jesse Hall    schedule 23.02.2021