Функции и библиотеки
В этой главе описываются, как создать a MTLFunction
возразите как ссылка на Металлическую программу построения теней или вычислите функцию и как организовать и функции доступа с a MTLLibrary
объект.
MTLFunction представляет программу построения теней, или вычислите функцию
A MTLFunction
объект представляет единственную функцию, записанную на Металлическом языке штриховки и выполненную на GPU как часть графики, или вычислите конвейер. Для получения дополнительной информации на Металлическом языке штриховки, посмотрите, что Металлическое Заштриховывает Руководство по Языку.
Чтобы передать данные или состояние между Металлическим временем выполнения и графикой или вычислить функцию, записанную на Металлическом языке штриховки, Вы присваиваете индекс параметра для текстур, буферов и сэмплеров. Индекс параметра идентифицирует, на какую текстуру, буфер или сэмплер ссылаются и Металлическим и Металлическим кодом штриховки во время выполнения.
Для передачи рендеринга Вы указываете a MTLFunction
объект для использования в качестве вершины или программы построения теней фрагмента в a MTLRenderPipelineDescriptor
объект, как детализировано в Создании Конвейерного состояния Рендеринга. Для вычислить передачи Вы указываете a MTLFunction
возразите при создании a MTLComputePipelineState
объект для целевого устройства, как описано в Указывают Вычислить состояние и Ресурсы для Вычислить Кодера Команды.
Библиотекой является репозиторий функций
A MTLLibrary
объект представляет репозиторий один или больше MTLFunction
объекты. Сингл MTLFunction
объект представляет одну Металлическую функцию, записанную с языком штриховки. В Металлическом исходном коде языка штриховки, любая функция, использующая Металлический функциональный спецификатор (vertex
, fragment
, или kernel
) может быть представлен a MTLFunction
объект в библиотеке. Металлическая функция без одного из этих функциональных спецификаторов не может быть непосредственно представлена a MTLFunction
объект, несмотря на то, что это может вызванный другой функцией в программе построения теней.
MTLFunction
объекты в библиотеке могут быть созданы из любого из этих источников:
Металлический код языка штриховки, скомпилированный в двоичный формат библиотеки во время процесса сборки приложения.
Текстовая строка, содержащая Металлический исходный код языка штриховки, компилирующийся приложением во время выполнения.
Создание библиотеки от скомпилированного кода
Для лучшей производительности скомпилируйте свой Металлический исходный код языка штриховки в файл библиотеки во время процесса сборки Вашего приложения в XCode, избегающем затрат компиляции функционального источника в течение времени выполнения Вашего приложения. Создать a MTLLibrary
объект от двоичного файла библиотеки, вызовите один из следующих методов MTLDevice
:
newDefaultLibrary
получает библиотеку, созданную для основного пакета, содержащего всю программу построения теней, и вычислите функции в проекте XCode приложения.newLibraryWithFile:error:
берет путь к файлу библиотеки и возвращает aMTLLibrary
объект, содержащий все функции, сохраненные в том файле библиотеки.newLibraryWithData:error:
берет двоичный блоб, содержащий код для функций в библиотеке, и возвращает aMTLLibrary
объект.
Для получения дополнительной информации о компиляции Металлической штриховки исходного кода языка во время процесса сборки, посмотрите Библиотеки Создания Во время Процесса сборки Приложения.
Создание библиотеки от исходного кода
Создать a MTLLibrary
от строки Металлического исходного кода языка штриховки, который может содержать несколько функций, вызовите один из следующих методов MTLDevice
. Когда библиотека создается, эти методы компилируют исходный код. Для указания параметров компилятора для использования установите свойства в a MTLCompileOptions
объект.
newLibraryWithSource:options:error:
синхронно исходный код компиляций от входной строки для созданияMTLFunction
объекты и затем возвращают aMTLLibrary
объект, содержащий их.newLibraryWithSource:options:completionHandler:
асинхронно исходный код компиляций от входной строки для созданияMTLFunction
объекты и затем возвращают aMTLLibrary
объект, содержащий их.completionHandler
блок кода, вызывающийся, когда завершается создание объекта.
Получение функции от библиотеки
newFunctionWithName:
метод MTLLibrary
возвраты a MTLFunction
объект с требуемым именем. Если имя функции в библиотеке, то, использующей Металлический спецификатор функции языка штриховки не найдено newFunctionWithName:
возвраты nil
.
Перечисление 4-1 использует newLibraryWithFile:error:
метод MTLDevice
определять местоположение файла библиотеки его именем полного пути и использованием его содержание для создания a MTLLibrary
объект с один или больше MTLFunction
объекты. Любые ошибки от загрузки файла возвращаются в error
. Тогда newFunctionWithName:
метод MTLLibrary
создает a MTLFunction
объект, представляющий вызванную функцию my_func
в исходном коде. Возвращенный функциональный объект myFunc
может теперь использоваться в приложении.
Перечисление 4-1 , получающее доступ к функции от библиотеки
NSError *errors; |
id <MTLLibrary> library = [device newLibraryWithFile:@"myarchive.metallib" |
error:&errors]; |
id <MTLFunction> myFunc = [library newFunctionWithName:@"my_func"]; |
Определение функциональных подробных данных во время выполнения
Поскольку фактическое содержание a MTLFunction
объект определяется графической программой построения теней или вычисляет функцию, которая может быть скомпилирована перед MTLFunction
объект создавался, его исходный код не мог бы быть непосредственно доступен приложению. Можно запросить следующий MTLFunction
свойства во время выполнения:
name
, строка с именем функции.functionType
, который указывает, объявляется ли функция как вершина, фрагмент, или вычислите функцию.vertexAttributes
, массивMTLVertexAttribute
объекты, описывающие, как данные атрибута вершины организованы в памяти и как это отображается на аргументах функции вершины. Для получения дополнительной информации посмотрите Дескриптор Вершины для Организации Данных.
MTLFunction
не обеспечивает доступ к аргументам функции. Отражательный объект (также MTLRenderPipelineReflection
или MTLComputePipelineReflection
, в зависимости от типа кодера команды), который показывает подробные данные программы построения теней или вычисляет аргументы функции, может быть получен во время создания конвейерного состояния. Для получения дополнительной информации при создании конвейерного состояния и отражательных объектов, посмотрите Создание Конвейерного состояния Рендеринга или Создание Вычислить Конвейерное состояние. Избегите получать отражательные данные, если они не будут использоваться.
Отражательный объект содержит массив MTLArgument
объекты для каждого типа функции поддерживаются кодером команды. Для MTLComputeCommandEncoder
, MTLComputePipelineReflection
имеет один массив MTLArgument
объекты в arguments
свойство, которые соответствуют параметрам вычислять функцию. Для MTLRenderCommandEncoder
, MTLRenderPipelineReflection
имеет два свойства, vertexArguments
и fragmentArguments
, это - массивы, соответствующие аргументам функции вершины и аргументам функции фрагмента, соответственно.
Не все параметры функции присутствуют в отражательном объекте. Отражательный объект только содержит параметры, имеющие связанный ресурс, но не параметры, объявленные с [[ stage_in ]]
спецификатор или встроенный [[ vertex_id ]]
или [[ attribute_id ]]
спецификатор.
Перечисление 4-2 показывает, как можно получить отражательный объект (в этом примере, MTLComputePipelineReflection
) и затем выполните итерации через MTLArgument
объекты в arguments
свойство.
Итерация перечисления 4-2 через аргументы функции
MTLComputePipelineReflection* reflection; |
id <MTLComputePipelineState> computePS = [device |
newComputePipelineStateWithFunction:func |
options:MTLPipelineOptionArgumentInfo |
reflection:&reflection error:&error]; |
for (MTLArgument *arg in reflection.arguments) { |
// process each MTLArgument |
} |
MTLArgument
свойства показывают подробные данные параметра функции языка штриховки.
name
свойство является просто именем параметра.active
булевская переменная, указывающая, может ли быть проигнорирован параметр.index
основанная на нуле позиция в ее соответствующей таблице параметра. Например, для[[ buffer(2) ]]
,index
2.access
описывает любые ограничения доступа, например, спецификатор доступа для чтения или доступа для записи.type
обозначен спецификатором языка штриховки, например,[[ buffer(n) ]]
,[[ texture(n) ]]
,[[ sampler(n) ]]
, или[[ threadgroup(n) ]]
.
type
определяет который другой MTLArgument
свойства релевантны.
Если
type
MTLArgumentTypeTexture
, тогдаtextureType
свойство указывает полный тип текстуры (такой какtexture1d_array
,texture2d_ms
, иtexturecube
типы на языке штриховки), иtextureDataType
свойство указывает тип данных компонента (такой какhalf
,float
,int
, илиuint
).Если
type
MTLArgumentTypeThreadgroupMemory
,threadgroupMemoryAlignment
иthreadgroupMemoryDataSize
свойства релевантны.Если
type
MTLArgumentTypeBuffer
,bufferAlignment
,bufferDataSize
,bufferDataType
, иbufferStructType
свойства релевантны.
Если буферным параметром является структура (т.е. bufferDataType
MTLDataTypeStruct
), bufferStructType
свойство содержит a MTLStructType
это представляет структуру, и bufferDataSize
содержит размер структуры, в байтах. Если буферным параметром является массив (или указатель на массив), то bufferDataType
указывает тип данных элемента, и bufferDataSize
содержит размер одного элемента матрицы, в байтах.
Перечисление 4-3 выполняет развертку в a MTLStructType
объект исследовать подробные данные элементов структуры, каждый представленный a MTLStructMember
объект. Элемент структуры может быть простым типом или может быть массивом или вложенной структурой. Если элемент является вложенной структурой, то вызовите structType
метод MTLStructMember
получить a MTLStructType
объект, представляющий структуру и затем рекурсивно выполняющий развертку для анализа ее. Если элемент является массивом, используйте arrayType
метод MTLStructMember
получить a MTLArrayType
это представляет его. Тогда исследуйте elementType
свойство MTLArrayType
. Если elementType
MTLDataTypeStruct
, вызовите elementStructType
метод, чтобы получить структуру и продолжать выполнять развертку в ее элементы. Если elementType
MTLDataTypeArray
, вызовите elementArrayType
метод, чтобы получить подмассив и проанализировать его далее.
Перечисление 4-3 , обрабатывающее параметр структуры
MTLStructType *structObj = [arg.bufferStructType]; |
for (MTLStructMember *member in structObj.members) { |
// process each MTLStructMember |
if (member.dataType == MTLDataTypeStruct) { |
// obtain MTLStructType* with [member structType] |
// recursively drill down into the nested struct |
} |
else if (member.dataType == MTLDataTypeArray) { |
// obtain MTLArrayType* with [member arrayType] |
// examine the elementType and drill down, if necessary |
} |
else { |
// member is neither struct nor array |
// analyze it; no need to drill down further |
} |
} |