store_structured (sm5 — asm)

Запись произвольного доступа из 1-4 32-разрядных компонентов в структурированное представление неупорядоченного доступа (UAV).

store_structured dst0[.write_mask], dstAddress[.select_component], dstByteOffset[.select_component], src0[.swizzle]
Элемент Описание:
dst0
[in] Адрес результатов операции.
dstAddress
[in] Адрес, по которому требуется написать.
dstByteOffset
[in] Индекс записываемой структуры.
src0
[in] Компоненты для записи.

Remarks

Эта инструкция выполняет 1–4 компонента *32-разрядные компоненты, записанные из src0 в dst0 по адресу в dstAddress и dstByteOffset. Преобразование формата не выполняется.

dst0 должен быть UAV (u#). В вычислительном шейдере можно также использовать общую память группы потоков (g#).

dstAddress указывает индекс структуры для записи.

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

                    BYTE *BufferContents;             // from dst0
                    UINT BufferStride;                // from dst0
                    UINT dstAddress, dstByteOffset;   // source registers
                    BYTE *WriteLocation;              // value to calculate

                    // calculate writing location
                     WriteLocation = BufferContents 
                                + BufferStride * dstAddress 
                                + dstByteOffset;

                    // calculate the number of components to write
                    switch (dstWriteMask)
                    {
                        x:    WriteComponents = 1; break;
                        xy:   WriteComponents = 2; break;
                        xyz:  WriteComponents = 3; break;
                        xyzw: WriteComponents = 4; break;
                        default:  // only these masks are valid                              
                    }

                    // copy the data from the source register with
                    //    the swizzle applied
                    memcpy(WriteLocation, swizzle(src0, src0.swizzle), 
                             WriteComponents * sizeof(INT32));

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

dst0 может иметь только маску записи, которая является одной из следующих: X, XY, XYZ, XYZW. Маска записи определяет количество 32-разрядных компонентов для записи без пробелов.

Из границ, адресуемых на U# casued by dstAddress , ничего не записывается в память вне границ.

Если dstByteOffset, включая dstWriteMask, является причиной отключения доступа к вам#, все содержимое UAV становится неопределенным.

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

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

cs_4_0 и cs_4_1 поддержку этой инструкции для UAV и TGSM.

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

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

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

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

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

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

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

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