Я знаю, что адресное пространство устройства используется при индексировании буфера, а постоянное адресное пространство используется, когда многие вызовы функции будут обращаться к одной и той же части буфера. Но мне все еще не очень ясно. Благодарю вас!
1 ответ
На основании этой Спецификации языка Metal Shading.
Адресное пространство устройства
Имя адресного пространства устройства относится к объектам буферной памяти, выделенным из пула памяти устройства, которые доступны как для чтения, так и для записи. Объект буферной памяти может быть объявлен как указатель или ссылка на скалярную, векторную или определяемую пользователем структуру. В приложении вызовы Metal API выделяют память для объекта буфера, который определяет фактический размер буферной памяти. Некоторые примеры:
// An array of a float vector with four components.
device float4 *color;
struct Foo {
float a[3];
int b[2];
}
// An array of Foo elements.
device Foo *my_info;
Поскольку вы всегда выделяете объекты текстуры из адресного пространства устройства, вам не нужен атрибут адреса устройства для типов текстур.
Постоянное адресное пространство
Постоянное имя адресного пространства относится к объектам буферной памяти, выделенным из пула памяти устройства, но доступным только для чтения. Переменные в области действия программы должны быть объявлены в адресном пространстве констант и инициализированы во время оператора объявления. Выражение инициализатора(ов) должно быть выражением основной константы. Переменные в области действия программы имеют то же время жизни, что и программа, и их значения сохраняются между вызовами любой вычислительной или графической функции в программе.
constant float samples[] = { 1.0f, 2.0f, 3.0f, 4.0f };
Указатели или ссылки на постоянное адресное пространство разрешены в качестве аргументов функций. Запись в переменные, объявленные в постоянном адресном пространстве, является ошибкой времени компиляции. Объявление такой переменной без инициализации также является ошибкой времени компиляции. Чтобы решить, какое адресное пространство (устройство или константа) использует буфер только для чтения, передаваемый графике или функции ядра, посмотрите, как осуществляется доступ к буферу внутри функции графики или ядра. Постоянное адресное пространство оптимизировано для нескольких экземпляров, выполняющих графическую функцию или функцию ядра, обращающихся к одному и тому же месту в буфере. Некоторыми примерами этого шаблона доступа являются доступ к свойствам света или материала для освещения/затенения, матрица массива матриц, используемая для скиннинга, вес фильтра, полученный из массива весов фильтра для свертки. Если несколько исполняемых экземпляров графической функции или функции ядра обращаются к буферу с использованием индекса, такого как идентификатор вершины, координата фрагмента или положение потока в сетке, буфер должен быть выделен в адресном пространстве устройства.
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.
const device
. Еслиconst
достаточно, чтобы определить только чтение для шейдера, то зачем нам нуженconstant
, поскольку он выглядит так же, какconst device
.