Поделиться через


ld_structured (sm5 - asm)

Произвольное чтение 1–4 32-разрядных компонентов из структурированного буфера.

ld_structured dest[.mask], srcAddress[.select_component], srcByteOffset[.select_component], src0[.swizzle]
Элемент Описание
Dest
[in] Адрес результатов операции.
srcAddress
[in] Указывает индекс считываемой структуры.
srcByteOffset
[in] Задает смещение байтов в структуре, с которой начинается чтение.
src0
Буфер для чтения. Этот параметр должен быть SRV (t#), UAV (u#). В вычислительном шейдере это также может быть общая память группы потоков (g#).

Комментарии

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

                    BYTE *BufferContents;         // from SRV or UAV
                    UINT BufferStride;            // from base resource
                    UINT srcAddress, srcByteOffset;   // from source registers
                    BYTE *ReadLocation;           // value to calculate
                    ReadLocation = BufferContents 
                                + BufferStride * srcAddress
                                + srcByteOffset;

                    UINT32 Temp[4];  // used to make code shorter

                    // apply the source resource swizzle on source data
                    Temp = read_and_swizzle(ReadLocation, srcSwizzle);

                    // write the components to the output based on mask
                    ApplyWriteMask(dstRegister, dstWriteMask, Temp);

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

Адресация вне границ в u#/t# любого заданного 32-разрядного компонента возвращает 0 для этого компонента, за исключением случаев, когда srcByteOffset, а swizzle — это то, что приводит к выходу за пределы доступа к вам#/t#, возвращаемое значение для всех компонентов не определено.

Адресация за пределы g# (границы конкретного g# в отличие от всей общей памяти) для любого 32-разрядного компонента возвращает неопределенный результат.

srcByteOffset — это отдельный аргумент из srcAddress , так как обычно это литерал. Это разделение параметров не было выполнено для атомаров в структурированной памяти.

cs_4_0 и cs_4_1 поддерживают эту инструкцию для UAV, SRV и TGSM.

Эта инструкция применяется к следующим этапам шейдера:

Вершина Корпуса Домен Geometry Пиксель Вычисления
X X X X X X

Так как БПЛА доступны на всех этапах шейдера для Direct3D 11.1, эта инструкция применяется ко всем этапам шейдера для БПЛА для среды выполнения Direct3D 11.1, которая доступна начиная с Windows 8.

Вершина Корпуса Домен Geometry Пиксель Вычисления
X X X X X X

Минимальная модель шейдера

Эта инструкция поддерживается в следующих моделях шейдеров:

Модель шейдера Поддерживается
Модель шейдера 5 да
Модель шейдера 4.1 нет
Модель шейдера 4 нет
Модель шейдера 3 (DirectX HLSL) нет
Модель шейдера 2 (DirectX HLSL) нет
Модель шейдера 1 (DirectX HLSL) нет

cs_4_0 и cs_4_1 поддерживают эту инструкцию для UAV, SRV и TGSM.

Сборка модели шейдера 5 (DirectX HLSL)