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


store_structured (sm5 - asm)

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

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

Комментарии

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

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

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

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

                    BYTE *BufferContents;             // from dest
                    UINT BufferStride;                // from dest
                    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));

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

Dest может иметь только маску записи, которая является одной из следующих: .x, .xy, .xyz, .xyzw. Маска записи определяет количество 32-разрядных компонентов для записи без пробелов.

Адресация вне границ в u# с помощью dstAddress означает, что ничего не записывается в память за пределы границ.

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

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

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

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

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

Вершина Корпуса Домен Geometry Пиксель Вычисления
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) нет

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