Шаблоны функций Metal Shading Language

Metal Shading Language (MSL) — универсальный язык программирования для создания графических и вычислительных функций используемых с приложениями написанными с использованием Metal Framework. Так говорит тутонхамон Apple.

И это в действительности так. Мало того, что MSL реализует синтаксическое подмножество C++, фактически это C++ базирующийся на спеках C++11. Например в MSL реализованы атомарные типы. Об этой фишке я как-нибудь расскажу отдельно с примерами. Однако надо понимать, что GPU не CPU и не поддерживает некоторые специфические вычисления или реализует их крайне не эффективно по сравнению с CPU, поэтому MSL — это некое ограниченное подобие C++11. К слову, MSL не поддерживает лямбда-функции (чорт, а было бы круто конечно, если бы да…). В любом случае это, хоть и маленький шаг одной яблочной компании, но огромный шаг всего человечества.

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

Напомню, шаблоны функций в C++ — это способ избежать дублирования кода для разных вариантов одной и той же функции но принимающей на вход разные наборы параметров и/или возвращающая разные типы данных. С++ предоставляет прекрасный механизм избежать флешбека при написании како-го часто используемого куска кода.

В MSL такая шаблонизация будет выглядеть так:


template<typename T> inline T max_component(vec<T, 2> v) {
    return max(v[0], v[1]);
}

template<typename T> inline T max_component(vec<T, 3> v) {
    return max(v[0], max(v[1], v[2]));
}

template<typename T> inline T max_component(vec<T, 4> v) {
    vec<T, 2> v2 = max(vec<T, 2>(v[0], v[1]), vec<T, 2>(v[2], v[3]));
    return max(v2[0], v2[1]);
}

template<typename T> inline T min_component(vec<T, 2> v) {
    return min(v[0], v[1]);
}

template<typename T> inline T min_component(vec<T, 3> v) {
    return min(v[0], min(v[1], v[2]));
}

template<typename T> inline T min_component(vec<T, 4> v) {
    vec<T, 2> v2 = min(vec<T, 2>(v[0], v[1]), vec<T, 2>(v[2], v[3]));
    return min(v2[0], v2[1]);
}

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

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

К примеру можно создать файле: IMPCommonMetal.h и в нем вот это все, и затем включить в тело основного файла с фильтром:

//
//  IMPFilter.metal
//  ImageMetalling-02
//
//  Created by denis svinarchuk on 27.10.15.
//  Copyright © 2015 ImageMetalling. All rights reserved.
//

#include <metal_stdlib>
#include <simd/simd.h>
#include "IMPCommonMetal.h"
using namespace metal;
//...

Если заметили ашипку, если написал глупость, если что-то не понятно: комментируйте или пишите на: imagemetalling [*] gmail.com .

Реклама

Шаблоны функций Metal Shading Language: Один комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s