Металлическая стандартная библиотека

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

Пространство имен и заголовочные файлы

Металлические стандартные библиотечные функции и перечисления объявляются в metal пространство имен. В дополнение к заголовочным файлам, описанным в Металлических стандартных библиотечных функциях, <metal_stdlib> заголовок доступен и может получить доступ ко всем функциям, поддерживаемым Металлической стандартной библиотекой.

Общие функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_common>. T один из скалярных или векторных типов с плавающей точкой.

Для одинарной точности, с плавающей точкой, Металлической также, поддерживает точный и быстрый вариант следующих общих функций: clamp и saturate. Различие между быстрыми и точными вариантами - то, как обрабатываются NaNs. В быстром варианте поведение NaNs не определено, тогда как точные варианты соблюдают правила IEEE 754 для обработки NaN. -ffast-math параметр компилятора (см. Математику Опции Intrinsics) используется для выбора надлежащего варианта при компиляции Металлического источника. Кроме того, metal::precise и metal::fast вложенные пространства имен доступны для обеспечения разработчиков способ явно выбрать быстрый или точный вариант этих общих функций, соответственно.

Целочисленные функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_integer>. T один из скалярных или векторных целых типов. Tu соответствующий скалярный или векторный целый тип без знака.

Реляционные функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_relational>. T один из скалярных или векторных типов с плавающей точкой. Ti один из скалярных или векторных целочисленных или булевых типов. Tb относится только к скалярным или векторным булевым типам.

Математические функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_math>. T один из скалярных или векторных типов с плавающей точкой. Ti относится только к скалярным или векторным целым типам.

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

-ffast-math параметр компилятора (отсылают к Математике Опции Intrinsics) используется для выбора надлежащего варианта при компиляции Металлического источника программы построения теней. Кроме того, metal::precise и metal::fast вложенные пространства имен также доступны и предоставляют разработчикам способ явно выбрать быстрый или точный вариант этих математических функций для одинарной точности, с плавающей точкой, как показано в Перечислении 5-1.

Перечисление 5-1  быстрые и точные варианты математических функций

#include <metal_stdlib>
using namespace metal;
 
float x;
float a = sin(x); // use fast or precise version based on compile option:
                  // - equivalent to fast::sin(x) if -ffast-math is specified
                  // - equivalent to precise::sin(x) if -fno-fast-math is specified
float b = fast::sin(x);    // use fast version of sin() always,
                           // regardless of compile option
float c = precise::cos(x); // use precise version of cos() always,
                           // regardless of compile option

Матричные функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_matrix>.

Например:

float4x4 mA;
float det = determinant(mA);

Геометрические функции

Функции в этом разделе находятся в Металлической стандартной библиотеке и определяются в заголовке <metal_geometric>. T векторный тип с плавающей точкой (floatn или halfn). Ts относится к соответствующему скалярному типу (т.е. float если T floatn и half если T halfn).

Для одинарной точности, с плавающей точкой, Металлической также, поддерживает точный и быстрый вариант следующих геометрических функций: distance, length, и normalize. -ffast-math параметр компилятора (отсылают к Математике Опции Intrinsics) используется для выбора надлежащего варианта при компиляции Металлического источника языка штриховки. Кроме того, metal::precise и metal::fast пространства имен также доступны и предоставляют разработчикам способ явно выбрать быстрый или точный вариант этих геометрических функций.

Вычислите функции

Функции в этом разделе и его подразделах могут быть вызваны только от a kernel функционируйте и определяются в заголовке <metal_compute>.

Функции Синхронизации threadgroup

Функция threadgroup, описанная ниже, поддерживается.

  • void threadgroup_barrier(mem_flags::flag)

    • Всем потокам в threadgroup, выполнение ядра должно выполнить эту функцию перед любым потоком, позволяют продолжать выполнение вне точки, в которой вызвана эта функция.

threadgroup_barrier функционируйте действия как выполнение и барьер памяти. threadgroup_barrier с функцией должны встретиться все потоки в threadgroup выполнение ядра.

Если threadgroup_barrier в условном операторе и если какой-либо поток вводит условный оператор и выполняет барьер, все потоки в threadgroup должны ввести условное выражение и выполнить барьер.

Если threadgroup_barrier в цикле, для каждой итерации цикла, все потоки в threadgroup должны выполниться threadgroup_barrier прежде чем любым потокам позволяют продолжать выполнение вне threadgroup_barrier.

threadgroup_barrier функция может также поставить предел памяти в очередь (чтения и записи) для обеспечения корректного упорядочивания операций памяти к памяти устройства или threadgroup.

flag параметр в threadgroup_barrier может быть один из следующих флагов, как описано в Таблице 5-1.

Таблица 5-1  mem_flags Перечислимые значения для threadgroup_barrier

mem_flags

Описание

mem_none

Никакой предел памяти не применяется, и threadgroup_barrier действия только как барьер выполнения.

mem_device

Гарантирует корректное упорядочивание операций памяти к памяти устройства.

mem_threadgroup

Гарантирует корректное упорядочивание операций памяти к threadgroup памяти для потоков в threadgroup.

mem_device_and_threadgroup

Гарантирует корректное упорядочивание операций памяти к устройству и threadgroup памяти для потоков в threadgroup.

Типы перечисления, используемые mem_flags указаны следующим образом:

enum class mem_flags {mem_none,
                      mem_device,
                      mem_threadgroup,
                      mem_device_and_threadgroup };

Графические функции

Этот раздел и его подразделы перечисляют набор графических функций, которые могут быть вызваны функциями фрагмента. Они определяются в заголовке <metal_graphics>.

Функции фрагмента

Функции в этих подразделах могут быть вызваны только в функции фрагмента (функция, объявленная с fragment спецификатор), или в функции вызывается от функции фрагмента. Иначе, поведение не определено и может привести к ошибке времени компиляции.

Функции фрагмента: деривативы

Металл включает следующие функции для вычислений деривативов. T один из float, float2, float3, float4, half, half2, half3, или half4.

  • T dfdx(T p)

    • Возвращается частная производная высокой точности указанного значения относительно экрана располагают координату x с интервалами.

  • T dfdy(T p)

    • Возвращается частная производная высокой точности указанного значения относительно экрана располагают координату y с интервалами.

  • T fwidth(T p)

    • Возвращает сумму абсолютных производных в x и y с помощью локального differencing для p; т.е. fabs(dfdx(p)) + fabs(dfdy(p)).

Функции фрагмента: выборки

Металл включает следующие функции на выборку:

  • uint get_num_samples()

    • Возвращает число выборок для мультивыбранного цветного присоединения.

  • float2 get_sample_position(uint indx)

    • Возвращает нормализованное демонстрационное смещение (x, y) для данного демонстрационного индекса indx. Значения x и y находятся в интервале [-1.0, 1.0).

Функции get_num_samples и get_sample_position возвратите число выборок для цветного присоединения и демонстрационных смещений для данного демонстрационного индекса. Например, для избыточной выборки прозрачности, можно использовать эти функции, чтобы заштриховать на фрагмент, но сделать тестирование альфа-версии на выборку.

Функции фрагмента: управление потоком

Следующая Металлическая функция используется для завершения фрагмента:

  • void discard_fragment(void)

    • Отмечает текущий фрагмент, как завершаемый, и вывод функции фрагмента для этого фрагмента отбрасывается.

Функции текстуры

Металл обеспечивает функции текстуры в семи категориях: выборка от текстуры, выборка выдерживает сравнение от текстуры, читала (не выбирая) от текстуры, собирает из текстуры, собирается, выдерживают сравнение от текстуры, пишут в текстуру и текстурируют функции запроса.

Они определяются в заголовке <metal_texture>.

Текстура sample, sample_compare, gather, и gather_compare функции берут offset параметр за 2D текстуру, 2D массив текстуры, 3D текстуру и кубическую текстуру. offset целочисленное значение, применяющееся к координате текстуры перед поиском каждого пикселя. Это целочисленное значение может быть в диапазоне-8 к +7. Значение по умолчанию 0.

Перегруженные варианты текстуры sample и sample_compare функции для 2D текстуры, 2D массива текстуры, 3D текстуры и кубической текстуры доступны и позволяют текстуре быть выбранной с помощью смещения, применяющегося к mip-уровню прежде, чем выбрать или с предоставленными пользователями градиентами в направлении x и y.

В этом разделе, Tv тип вектора с 4 компонентами на основе шаблонного типа <T> используемый для объявления типа текстуры. Если T float, Tv float4. Если T half, Tv half4. Если T int, Tv int4. Если T uint, Tv uint4. Если T short, Tv short4. Если T ushort, Tv ushort4.

Вся текстура read функции включают параметр Лода, указывая, которые множественно отображают уровень текстуры для чтения из. Указание нулевых чтений от основного (самого большого) уровня множественного отображения и более высоких значений, считанных из выше, множественно отображает уровни до значения, возвращенного get_num_mip_levels.

lodoptions параметр в текстуре sample функции должны использовать один из типов bias, level, или gradientX, где X суффикс, надлежащий типу текстуры (2d, 3d, или cube). Перечисление 5-2 показывает конструкторам для этих типов. Параметр Лода к level конструктор имеет тот же эффект как параметр Лода для текстурирования read функции.

  Конструкторы перечисления 5-2 для Текстуры lodoptions Типы

bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
gradient3d(float3 dPdx, float3 dPdy)
gradientcube(float3 dPdx, float3 dPdy)

1D Текстура

Следующие встроенные функции воздействуют на одномерные текстуры:

  • Tv sample(sampler s, float coord) const

    • Демонстрационные элементы текстуры от 1D текстура.

  • Tv read(uint coord) const

    • Чтения, не выбирая от 1D текстура.

  • void write(Tv color, uint coord)

    • Записи к определенному mip уровню 1D текстура.

  • uint get_width() const

    • Возвращает ширину 1D текстура.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 1D текстура.

1D массив текстуры

Следующие встроенные функции воздействуют на массивы 1D текстуры:

  • Tv sample(sampler s, float coord, uint array) const

    • Демонстрационные элементы текстуры от 1D текстурируют массив.

  • Tv read(uint coord, uint array) const

    • Чтения, не выбирая от 1D текстурируют массив.

  • void write(Tv color, uint coord, uint array)

    • Записи к определенному mip уровню 1D текстурируют массив.

  • uint get_width() const

    • Возвращает ширину 1D массив текстуры.

  • uint get_array_size() const

    • Возвращает число текстур в 1D массив текстуры.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 1D массив текстуры.

2D Текстура

Следующие встроенные функции воздействуют на двумерные текстуры:

  • Tv sample(sampler s, float2 coord, int2 offset = int2(0)) const

    Tv sample(sampler s, float2 coord, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D текстуры. lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • Tv read(uint2 coord, uint lod = 0) const

    • Чтения, не выбирая от 2D текстуры.

  • void write(Tv color, uint2 coord, uint lod = 0)

    • Записи к определенному mip уровню 2D текстуры.

  • enum class component { x, y, z, w };

    Tv gather(sampler s, float2 coord, int2 offset = int2(0), component c = component::x) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D текстуры. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D текстуры.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 2D текстуре.

Перечисление 5-3 показывает несколько использования 2D текстуры sample функция, в зависимости от ее параметров.

  Пример выборки текстуры перечисления 5-3 2D

#include <metal_stdlib>
using namespace metal;

texture2d<float> tex;
sampler s;
float2 coord;
int2 offset;
float lod;

// no optional arguments
float4 clr = tex.sample(s, coord);

// sample using a mip-level
clr = tex.sample(s, coord, level(lod));

// sample with an offset
clr = tex.sample(s, coord, offset);

// sample using a mip-level and an offset 
clr = tex.sample(s, coord, level(lod), offset);

2D массив текстуры

Следующие встроенные функции воздействуют на массивы 2D текстур:

  • Tv sample(sampler s, float2 coord, uint array, int2 offset = int2(0)) const

    Tv sample(sampler s, float2 coord, uint array, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D массива текстуры. lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • Tv read(uint2 coord, uint array, uint lod = 0) const

    • Чтения, не выбирая от 2D массива текстуры.

  • void write(Tv color, uint2 coord, uint array, uint lod = 0)

    • Записи к определенному mip уровню 2D массива текстуры.

  • enum class component { x, y, z, w };

    Tv gather(sampler s, float2 coord, uint array, int2 offset = int2(0), component c = component::x) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D массива текстуры. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D массива текстуры.

  • uint get_array_size() const

    • Возвращает число текстур в 2D массиве текстуры.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 2D массиве текстуры.

3D Текстура

Следующие встроенные функции воздействуют на трехмерные текстуры:

  • Tv sample(sampler s, float3 coord, int3 offset = int3(0)) const

    Tv sample(sampler s, float3 coord, lod_options options, int3 offset = int3(0)) const

    • Демонстрационные элементы текстуры от 3D текстуры. lod_options параметр должен быть одним из типов bias, level, или gradient3d. (См. Перечисление 5-2.)

  • Tv read(uint3 coord, uint lod = 0) const

    • Чтения, не выбирая от 3D текстуры.

  • void write(Tv color, uint3 coord, uint lod = 0)

    • Записи к определенному mip уровню 3D текстуры.

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    uint get_depth(uint lod = 0) const

    • Возвращает ширину, высоту или глубину 3D текстуры.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 3D текстуре.

Кубическая текстура

Следующие встроенные функции воздействуют на кубические текстуры:

  • Tv sample(sampler s, float3 coord) const

    Tv sample(sampler s, float3 coord, lod_options options) const

    • Демонстрационные элементы текстуры от кубической текстуры. lod_options параметр должен быть одним из типов bias, level, или gradientcube. (См. Перечисление 5-2.)

  • enum class component { x, y, z, w };

    Tv gather(sampler s, float3 coord, component c = component::x) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке кубической текстуры. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту кубической текстуры.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в кубической текстуре.

2D мультивыбранная текстура

Следующие встроенные функции воздействуют на 2D мультивыбранные текстуры:

  • Tv read(uint2 coord, uint sample) const

    • Чтения, не выбирая от 2D мультивыбранной текстуры.

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D мультивыбранной текстуры.

  • uint get_num_samples() const

    • Возвращает число выборок в 2D мультивыбранной текстуре.

2D текстура глубины

Следующие встроенные функции воздействуют на 2D текстуры глубины:

  • T sample(sampler s, float2 coord, int2 offset = int2(0)) const

    T sample(sampler s, float2 coord, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D текстуры глубины. lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • T sample_compare(sampler s, float2 coord, float compare_value, int2 offset = int2(0)) const

    T sample_compare(sampler s, float2 coord, float compare_value, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D глубины текстурируют, и сравнивает единственный компонент с указанным сравнительным значением. T должен быть a float введите, и lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • T read(uint2 coord, uint lod = 0) const

    • Чтения, не выбирая от 2D текстуры глубины.

  • Tv gather(sampler s, float2 coord, int2 offset = int2(0)) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D текстуры глубины. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • Tv gather_compare(sampler s, float2 coord, float compare_value, int2 offset = int2(0)) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D текстуры глубины, затем сравнивают эти выборки с указанным сравнительным значением. Возвраты 1.0 для каждого компонента, куда сравнение передает и 0.0 где это перестало работать. T должен быть a float ввести.

      Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D текстуры глубины.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 2D текстуре глубины.

2D массив текстуры глубины

Следующие встроенные функции воздействуют на массивы 2D текстур глубины.

  • T sample(sampler s, float2 coord, uint array, int2 offset = int2(0)) const

    T sample(sampler s, float2 coord, uint array, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D глубины текстурируют массив. lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • T sample_compare(sampler s, float2 coord, uint array, float compare_value, int2 offset = int2(0)) const

    T sample_compare(sampler s, float2 coord, uint array, float compare_value, lod_options options, int2 offset = int2(0)) const

    • Демонстрационные элементы текстуры от 2D текстуры глубины выстраивают, и сравнивает единственный компонент с указанным сравнительным значением. T должен быть a float введите, и lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • T read(uint2 coord, uint array, uint lod = 0) const

    • Чтения, не выбирая от 2D глубины текстурируют массив.

  • Tv gather(sampler s, float2 coord, uint array, int2 offset = int2(0)) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D массива текстуры глубины. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • Tv gather_compare(sampler s, float2 coord, uint array, float compare_value, int2 offset = int2(0)) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке 2D массива текстуры глубины, затем сравнивают эти выборки с указанным сравнительным значением. Возвраты 1.0 для каждого компонента, куда сравнение передает и 0.0 где это перестало работать. T должен быть a float ввести.

      Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D массива текстуры глубины.

  • uint get_array_size() const

    • Возвращает число текстур в 2D массиве текстуры глубины.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в 2D массиве текстуры глубины.

Текстура глубины куба

Следующие встроенные функции воздействуют на текстуры глубины куба:

  • T sample(sampler s, float3 coord) const

    T sample(sampler s, float3 coord, lod_options options) const

    • Демонстрационные элементы текстуры от текстуры глубины куба. lod_options параметр должен быть одним из типов bias, level, или gradientcube. (См. Перечисление 5-2.)

  • T sample_compare(sampler s, float3 coord, float compare_value) const

    T sample_compare(sampler s, float3 coord, float compare_value, lod_options options) const

    • Демонстрационные элементы текстуры от глубины куба текстурируют, и сравнивает единственный компонент с указанным сравнительным значением. T должен быть a float введите, и lod_options параметр должен быть одним из типов bias, level, или gradient2d. (См. Перечисление 5-2.)

  • Tv gather(sampler s, float3 coord) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке массива текстуры глубины куба. Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • Tv gather_compare(sampler s, float3 coord, float compare_value) const

    • Собирает четыре выборки, которые могут использоваться для билинейной интерполяции при выборке текстуры глубины куба, затем сравнивают эти выборки с указанным сравнительным значением. Возвраты 1.0 для каждого компонента, куда сравнение передает и 0.0 где это перестало работать. T должен быть a float ввести.

      Компоненты итогового вектора ссылаются на эти четыре выборки в следующем порядке:

      result.x = coord + float2(0, 1)

      result.y = coord + float2(1, 1)

      result.z = coord + float2(1, 0)

      result.w = coord

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту текстуры глубины куба.

  • uint get_num_mip_levels() const

    • Возвращает число mip уровней в текстуре глубины куба.

2D мультивыбранная текстура глубины

Следующие встроенные функции воздействуют на 2D мультивыбранные текстуры глубины.

  • Tv read(uint2 coord, uint sample) const

    • Чтения, не выбирая от 2D мультивыбранной текстуры глубины.

  • uint get_width(uint lod = 0) const

    uint get_height(uint lod = 0) const

    • Возвращает ширину или высоту 2D мультивыбранной текстуры глубины.

  • uint get_num_samples() const

    • Возвращает число выборок в 2D мультивыбранной текстуре глубины.

Упакуйте и распакуйте функции

Этот раздел перечисляет Металлические функции для преобразования векторных данных с плавающей точкой к и от упакованного целочисленного значения. Функции определяются в заголовке <metal_pack>. Относитесь для Текстурирования Правил Обращения и Преобразования для подробных данных о том, как преобразовать из 8-разрядного, 10-разрядного или 16-разрядного целого числа со знаком, или целое без знака оценивают нормализованному синглу - или полуточность значение с плавающей точкой и наоборот.

Распакуйте целые числа и преобразуйте в вектор с плавающей точкой

Следующие функции распаковывают многократные значения от единственного целого без знака и затем преобразовывают их в значения с плавающей точкой, которые сохранены в векторе.

  • float4 unpack_unorm4x8_to_float(uint x)

    float4 unpack_snorm4x8_to_float(uint x)

    half4 unpack_unorm4x8_to_half(uint x)

    half4 unpack_snorm4x8_to_half(uint x)

    • Распаковывает 32-разрядное целое без знака в четыре 8-разрядных целых числа со знаком или целых без знака, и затем преобразовывает каждое 8-разрядное целое число со знаком, или целое без знака оценивают нормализованному синглу - или полуточность значение с плавающей точкой для генерации вектора с 4 компонентами.

  • float4 unpack_unorm4x8_srgb_to_float(uint x)

    half4 unpack_unorm4x8_srgb_to_half(uint x)

    • Распаковывает 32-разрядное целое без знака в четыре 8-разрядных целых числа со знаком или целых без знака, и затем преобразовывает каждое 8-разрядное целое число со знаком, или целое без знака оценивают нормализованному синглу - или полуточность значение с плавающей точкой для генерации вектора с 4 компонентами. R, g, и b значения цвета преобразовываются от sRGB до линейного RGB.

  • float2 unpack_unorm2x16_to_float(uint x)

    float2 unpack_snorm2x16_to_float(uint x)

    half2 unpack_unorm2x16_to_half(uint x)

    half2 unpack_snorm2x16_to_half(uint x)

    • Распаковывает 32-разрядное целое без знака в два 16-разрядных целых числа со знаком или целых без знака, и затем преобразовывает каждое 16-разрядное целое число со знаком, или целое без знака оценивают нормализованному синглу - или полуточность значение с плавающей точкой для генерации вектора с 2 компонентами. ( unpack_unorm2x16_to_half и unpack_snorm2x16_to_half функции могут привести к потере точности при преобразовании из 16-разрядного нормализованного без знака (unorm) или подписанный нормализованный (snorm) целочисленное значение к значению с плавающей точкой полуточности.)

  • float4 unpack_unorm10a2_to_float(uint x)

    float3 unpack_unorm565_to_float(ushort x)

    half4 unpack_unorm10a2_to_half(uint x)

    half3 unpack_unorm565_to_half(ushort x)

    • Преобразовывает 1010102 (10a2), или 565 значений цвета к соответствующему нормализованному синглу - или полуточность вектор с плавающей точкой.

Преобразуйте Вектор С плавающей точкой в Целые числа, затем Пакет Целые числа

Следующие функции запускаются с вектора с плавающей точкой, преобразовывают компоненты в целочисленные значения, и затем упаковывают многократные значения в единственное целое без знака.

  • uint pack_float_to_unorm4x8(float4 x)

    uint pack_float_to_snorm4x8(float4 x)

    uint pack_half_to_unorm4x8(half4 x)

    uint pack_half_to_snorm4x8(half4 x)

    • Преобразовывает вектор с 4 компонентами, нормализовал единственный - или полуточность значение с плавающей точкой к четырем 8-разрядным целочисленным значениям и упаковывает эти 8-разрядные целочисленные значения в 32-разрядное целое без знака.

  • uint pack_float_to_srgb_unorm4x8(float4 x)

    uint pack_half_to_srgb_unorm4x8(half4 x)

    • Преобразовывает вектор с 4 компонентами, нормализовал единственный - или полуточность значение с плавающей точкой к четырем 8-разрядным целочисленным значениям и упаковывает эти 8-разрядные целочисленные значения в 32-разрядное целое без знака. Значения цвета преобразовываются от линейного RGB до sRGB.

  • uint pack_float_to_unorm2x16(float2 x)

    uint pack_float_to_snorm2x16(float2 x)

    uint pack_half_to_unorm2x16(half2 x)

    uint pack_half_to_snorm2x16(half2 x)

    • Преобразовывает вектор с 2 компонентами нормализованного сингла - или полуточность значения с плавающей точкой к двум 16-разрядным целочисленным значениям и упаковывает эти 16-разрядные целочисленные значения в 32-разрядное целое без знака.

  • uint pack_float_to_unorm10a2(float4)

    ushort pack_float_to_unorm565(float3)

    uint pack_half_to_unorm10a2(half4)

    ushort pack_half_to_unorm565(half3)

    • Преобразовывает 4-или вектор с 3 компонентами нормализованного сингла - или полуточность значения с плавающей точкой к упакованному целочисленному значению в формате RGB565 или RGB10A2. Для получения дополнительной информации на этих форматах, посмотрите Pixel Format Codes.

Атомарные функции

Металлический язык штриховки реализует подмножество C++ 11 атомной энергетики и операции синхронизации. Для атомарных операций Металл поддерживает только a memory_order из memory_order_relaxed. Если атомарная работа к threadgroup памяти, объем памяти этих атомарных операций является threadgroup. Если атомарная работа к памяти устройства, то объем памяти является устройством GPU.

Существует только несколько видов операций на атомарных типах, несмотря на то, что существует много экземпляров тех видов. Этот раздел указывает каждый общий вид. Эти операции определяются в заголовке <metal_atomic>.

memory_order перечисление определяется следующим образом:

enum memory_order {
        memory_order_relaxed
};

Атомарные функции хранилища

Эти функции атомарно заменяют значение, которым указывают obj (*obj) с desired:

void atomic_store_explicit(volatile device atomic_int* obj, 
                           int desired,
                           memory_order order)
void atomic_store_explicit(volatile device atomic_uint* obj, 
                           uint desired,
                           memory_order order)
void atomic_store_explicit(volatile threadgroup atomic_int* obj, 
                           int desired,
                           memory_order order)
void atomic_store_explicit(volatile threadgroup atomic_uint* obj, 
                           uint desired,
                           memory_order order)

Атомарные функции загрузки

Эти функции атомарно получают значение, которым указывают obj:

int atomic_load_explicit(volatile device atomic_int* obj,
                          memory_order order)
uint atomic_load_explicit(volatile device atomic_uint* obj,
                          memory_order order)
int atomic_load_explicit(volatile threadgroup atomic_int* obj,
                         memory_order order)
uint atomic_load_explicit(volatile threadgroup atomic_uint* obj,
                          memory_order order)

Атомарные функции Exchange

Эти функции атомарно заменяют значение, которым указывают obj с desired и возвратите значение, ранее сдержанное obj:

int atomic_exchange_explicit(volatile device atomic_int *obj, 
                             int desired,
                             memory_order order)
uint atomic_exchange_explicit(volatile device atomic_uint *obj, 
                              uint desired,
                              memory_order order)
int atomic_exchange_explicit(volatile threadgroup atomic_int *obj, 
                             int desired,
                             memory_order order)
uint atomic_exchange_explicit(volatile threadgroup atomic_uint *obj, 
                              uint desired,
                              memory_order order)

Атомарный выдерживают сравнение и функции Exchange

Эти функции атомарно сравнивают значение, которым указывают obj со значением в expected. Если те значения равны, функциональные замены *obj с desired (путем выполнения работы «чтение изменяет запись»). Каждая функция возвращает булево значение, указывающее, успешно выполнилась ли его работа.

bool atomic_compare_exchange_weak_explicit(
                             volatile device atomic_int *obj,
                             int *expected,
                             int desired,
                             memory_order succ,
                             memory_order fail)
bool atomic_compare_exchange_weak_explicit(
                             volatile device atomic_uint *obj,
                             uint *expected,
                             uint desired,
                             memory_order succ,
                             memory_order fail)
bool atomic_compare_exchange_weak_explicit(
                             volatile threadgroup atomic_int *obj,
                             int *expected,
                             int desired,
                             memory_order succ,
                             memory_order fail)
bool atomic_compare_exchange_weak_explicit(
                             volatile threadgroup atomic_uint *obj,
                             uint *expected,
                             uint desired,
                             memory_order succ,
                             memory_order fail)

Атомарная выборка и изменяет функции

Следующие операции выполняют арифметические и поразрядные вычисления. Все эти операции применимы к объекту любого атомарного типа. Ключ, оператор и корреспонденция вычисления даны в Таблице 5-2.

Таблица 5-2  атомарные функции работы

Ключ

Оператор

Вычисление

add

+

дополнение

and

&

поразрядно и

max

max

вычислите макс.

min

min

вычислите минуту

or

|

поразрядно включительно или

sub

-

вычитание

xor

^

поразрядно монопольный или

Следующие функции атомарно заменяют значение, которым указывают obj с результатом вычисления значения, указанного key и arg, где key соответствует любому значению ключа от Таблицы 5-2. Эти операции являются атомарными операциями «чтение, изменяют запись». Для типов целого числа со знаком арифметика определяется для использования two's-дополнительного представления с тихим переносом на переполнении. Нет никаких неопределенных результатов. Каждая функция возвращает значение, ранее сдержанное obj.


// addition
int atomic_fetch_add_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_add_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_add_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_add_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// bitwise and
int atomic_fetch_and_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_and_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_and_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_and_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// compute max
int atomic_fetch_max_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_max_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_max_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_max_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// compute min
int atomic_fetch_min_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_min_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_min_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_min_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// bitwise inclusive or
int atomic_fetch_or_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_or_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_or_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_or_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// subtraction
int atomic_fetch_sub_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_sub_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_sub_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_sub_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
 

// bitwise exclusive or
int atomic_fetch_xor_explicit(volatile device atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_xor_explicit(volatile device atomic_uint *obj, 
                               uint arg, 
                               memory_order order)
int atomic_fetch_xor_explicit(volatile threadgroup atomic_int *obj, 
                              int arg, 
                              memory_order order)
uint atomic_fetch_xor_explicit(volatile threadgroup atomic_uint *obj, 
                               uint arg, 
                               memory_order order)