
Предварительная версию Shader Model 6.10 в рамках обновления DirectX Agility SDK 1.720 не стало революцией, но принесло ряд целенаправленных улучшений для современных рабочих нагрузок — от нейросетевого рендеринга до крупномасштабных вычислительных задач.
Новый набор матричных API, объединённых под названием LinAlg, стандартизирует операции линейной алгебры прямо на уровне шейдеров. Это позволяет эффективно выполнять вычисления, связанные с нейросетевым рендерингом и обработкой изображений, без привлечения отдельных вычислительных ядер. Особенность в том, что матричные операции теперь доступны из отдельных потоков шейдеров в графическом конвейере реального времени.
API вводит две новые встроенные функции: GetGroupWaveIndex() и GetGroupWaveCount(). Они дают вычислительным, меш- и амплификационным шейдерам прямое представление о структуре «волны» внутри группы потоков. Первая возвращает индекс текущей волны, вторая — общее количество волн, выполняющих группу. Это устраняет необходимость в небезопасных обходных путях (например, делении SV_GroupIndex на WaveGetLaneCount()) и обеспечивает корректную работу на любом GPU с любым размером волны.
Снято многолетнее ограничение в 32 КБ (28 КБ для меш-шейдеров) на общую память группы. Разработчики теперь могут запрашивать фактический аппаратный лимит через новый вызов MaxGroupSharedMemoryPerGroup, а в точке входа шейдера указывать требуемый объём памяти с помощью атрибута [GroupSharedLimit()]. Это позволяет использовать полную ёмкость современных GPU, открывая путь к алгоритмам с крупными тайловыми вычислениями, программной растеризацией и большими матричными задачами, которые раньше упирались в ограничения спецификации, а не «железа».

Добавлены две полезные функции:
- TriangleObjectPositions() — возвращает координаты вершин треугольника, в который попал луч, и может вызываться из шейдеров любого попадания или через RayQuery.
- ClusterID() — возвращает пользовательский идентификатор кластера (пока не очень полезен, так как поддержка кластерной геометрии в DXR ещё не готова, но ожидается во второй половине 2026 года).
Старая модель ResourceBarrier не умела выражать зависимости между однотипными операциями (например, копирование → копирование), что приводило к последовательному выполнению и простоям GPU. Новые API позволяют по-настоящему перекрывать независимые операции, а разработчики берут на себя явную синхронизацию только там, где есть реальные конфликты (например, перекрывающиеся регионы одного буфера). Также добавлены команды ClearTextureSubresources и FillBuffers для пакетной очистки и заполнения, а также ClearBoundRenderTargetViews для очистки прямо привязанных целей рендеринга.
Обновление продолжает тенденцию к смещению акцента в пользу современных архитектур:
- LinAlg полностью поддерживается на всех RTX (NVIDIA) и Radeon RX 9000 (AMD), у Intel пока в планах.
- Group Wave Index доступен на AMD Radeon 7000/9000 и Intel Arc B-Series, у NVIDIA ожидается в следующем выпуске.
- Общая память (поддержка полных лимитов) декларируется на всех RTX, RDNA 3/4 и Arc B-Series.
- Новые интринсики трассировки лучей поддерживаются на всех RTX, RDNA 3/4 и Arc B-Series.
- Пакетные асинхронные команды поддерживаются на всех RTX, RDNA 3/4 и Arc B-Series.
Более старые архитектуры выпадают из списка поддержки, что знаменует собой дальнейшее движение Microsoft в сторону оптимизации API под возможности современного «железа» в ущерб обратной совместимости.
Разработчики получают более эффективные инструменты для нейросетевого рендеринга, трассировки лучей и крупномасштабных вычислительных эффектов. Поддержка линейной алгебры в шейдерах открывает новые возможности для ML на GPU. Снятие ограничений на общую память групп позволяет реализовывать алгоритмы, которые раньше были невозможны.
Для пользователей эти улучшения означают более предсказуемую производительность и лучшее использование возможностей их видеокарт в будущих играх и приложениях, однако только при условии, что они используют современные GPU. Владельцы старого оборудования, скорее всего, не увидят выгоды от этих изменений.


