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) | нет |