Функции и библиотеки

В этой главе описываются, как создать 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: берет путь к файлу библиотеки и возвращает a MTLLibrary объект, содержащий все функции, сохраненные в том файле библиотеки.

  • newLibraryWithData:error: берет двоичный блоб, содержащий код для функций в библиотеке, и возвращает a MTLLibrary объект.

Для получения дополнительной информации о компиляции Металлической штриховки исходного кода языка во время процесса сборки, посмотрите Библиотеки Создания Во время Процесса сборки Приложения.

Создание библиотеки от исходного кода

Создать a MTLLibrary от строки Металлического исходного кода языка штриховки, который может содержать несколько функций, вызовите один из следующих методов MTLDevice. Когда библиотека создается, эти методы компилируют исходный код. Для указания параметров компилятора для использования установите свойства в a MTLCompileOptions объект.

  • newLibraryWithSource:options:error: синхронно исходный код компиляций от входной строки для создания MTLFunction объекты и затем возвращают a MTLLibrary объект, содержащий их.

  • newLibraryWithSource:options:completionHandler: асинхронно исходный код компиляций от входной строки для создания MTLFunction объекты и затем возвращают a MTLLibrary объект, содержащий их. 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 свойства во время выполнения:

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 свойства показывают подробные данные параметра функции языка штриховки.

type определяет который другой MTLArgument свойства релевантны.

Если буферным параметром является структура (т.е. 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
    }
}