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


store_raw (sm5 - asm)

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

store_raw dest[.write_mask], dstByteOffset[.select_component], src0[.swizzle]
Элемент Описание
Dest
[in] Адрес памяти.
dstByteOffset
[in] Смещение.
src0
[in] Компоненты для записи.

Комментарии

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

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

dstByteOffset задает базовое 32-разрядное значение в памяти для окна из 4 последовательных 32-разрядных значений, в которых могут быть записаны данные в зависимости от swizzle и маски для других параметров.

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

                    BYTE *BufferContents;          // from src0
                    UINT dstByteOffset;            // source register
                    BYTE *WriteLocation;           // value to calculate

                    // calculate writing location
                    WriteLocation = BufferContents 
                                + 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(UINT32));

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

Вне пределов адресации в u# означает, что ничего не записывается в память за пределы границ; любая часть, которая находится в границах, написана правильно.

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

cs_4_0 и cs_4_1 поддерживают эту инструкцию для БПЛА.

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

Вершина Корпуса Домен 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)