Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 4
1

Шаблоны + инлайны

26.03.2019, 17:55. Показов 537. Ответов 3
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* premultiplied target */
template<typename target_format>
struct ps_merger_premultiplied
{
    static inline void merge(PolygonShader& ps, COLOR4& src_c, void* target)
    {
        COLOR4 dst_c;
 
        // take
        const unsigned int c = *((unsigned int*)target);
        target_format::to_color(c, c >> 24, dst_c);
 
        // blend
        float inv_src_alpha = 1.0f - src_c.a;
        src_c.r = src_c.r + dst_c.r * inv_src_alpha;
        src_c.g = src_c.g + dst_c.g * inv_src_alpha;
        src_c.b = src_c.b + dst_c.b * inv_src_alpha;
        src_c.a = src_c.a + dst_c.a * inv_src_alpha;
 
        // put
        ((target_format*)target)->from_color(src_c);
    }
};
и один из вариантов target_format

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct b8g8r8a8_srgb
{
    unsigned int packed;
    inline b8g8r8a8_srgb(void) {}
    inline b8g8r8a8_srgb(unsigned int uint) { packed = uint; }
    static inline void to_color(unsigned int c, unsigned int a, COLOR4& color)
    {
#ifdef SAMPLER_USE_TABLES_SRGB
        color.r = srgb2float[(c >> 16) & 0xFF];
        color.g = srgb2float[(c >>  8) & 0xFF];
        color.b = srgb2float[c & 0xFF];
        color.a = linear2float[a];
#else
        color.r = ((float)((c >> 16) & 0xFF)) / 255.0f;
        color.g = ((float)((c >> 8) & 0xFF)) / 255.0f;
        color.b = ((float)(c & 0xFF)) / 255.0f;
        color.a = ((float)a) / 255.0f;
        color.srgb2lin();
#endif
    }
    inline void from_color(const COLOR4& color)
    {
        COLOR4 clr = color;
        clr.lin2srgb();
        const unsigned char r = clr.r > 1.0f ? 255 : (clr.r < 0.0f ? 0 : (unsigned char)(clr.r * 255.0f + 0.5f));
        const unsigned char g = clr.g > 1.0f ? 255 : (clr.g < 0.0f ? 0 : (unsigned char)(clr.g * 255.0f + 0.5f));
        const unsigned char b = clr.b > 1.0f ? 255 : (clr.b < 0.0f ? 0 : (unsigned char)(clr.b * 255.0f + 0.5f));
        const unsigned char a = clr.a > 1.0f ? 255 : (clr.a < 0.0f ? 0 : (unsigned char)(clr.a * 255.0f + 0.5f));
        packed = (a << 24) | (r << 16) | (g << 8) | b;
    }
};
и вроде бы всё должно быть хорошо, но я воспользовался специализацией и влепил отдельный "смешиватель" для формата b8g8r8a8_srgb
таким вот образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#if 1
    // immediate work faster
 
    template<>
    static inline void ps_merger_premultiplied<b8g8r8a8_srgb>::merge(PolygonShader&, COLOR4& src_c, void* target)
    {
        COLOR4 dst_c;
 
        // take
        const unsigned int c = *((unsigned int*)target);
        dst_c.r = srgb2float[(c >> 16) & 0xFF];
        dst_c.g = srgb2float[(c >>  8) & 0xFF];
        dst_c.b = srgb2float[c & 0xFF];
        dst_c.a = linear2float[c >> 24];
 
        // blend
        float inv_src_alpha = 1.0f - src_c.a;
        src_c.r = src_c.r + dst_c.r * inv_src_alpha;
        src_c.g = src_c.g + dst_c.g * inv_src_alpha;
        src_c.b = src_c.b + dst_c.b * inv_src_alpha;
        src_c.a = src_c.a + dst_c.a * inv_src_alpha;
 
        // put
        src_c.lin2srgb();
        const unsigned char r = src_c.r > 1.0f ? 255 : (src_c.r < 0.0f ? 0 : (unsigned char)(src_c.r * 255.0f + 0.5f));
        const unsigned char g = src_c.g > 1.0f ? 255 : (src_c.g < 0.0f ? 0 : (unsigned char)(src_c.g * 255.0f + 0.5f));
        const unsigned char b = src_c.b > 1.0f ? 255 : (src_c.b < 0.0f ? 0 : (unsigned char)(src_c.b * 255.0f + 0.5f));
        const unsigned char a = src_c.a > 1.0f ? 255 : (src_c.a < 0.0f ? 0 : (unsigned char)(src_c.a * 255.0f + 0.5f));
        *((unsigned int*)target) = (a << 24) | (r << 16) | (g << 8) | b;
    }
#endif
и чисто из-за того, что всё непосредственно находится в одном месте, есть заметное прибавление в скорости (5-10%)
т.е. получается что шаблоны + инлайны мне помогут не более чем вызов функций по ссылкам ( typedef void (*to_color)(unsigned int c, unsigned int a, COLOR4& color) )
или я что-то делаю не правильно?
я не ковырялся в ассемблере, так как просто по fps уже понятно что в данном месте инлайны не хотят работать
и их форсировать нельзя, так как x64.. может быть есть какой-то другой способ насильно инлайнить?

(vs2017, оптимизация /O2 /Ob2 /Oi /Ot)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2019, 17:55
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем,...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов...

Хранить шаблоны документов в базе и выводить данные в эти шаблоны
Доброго времени суток. Интересует вопрос: мне необходимо формировать вордовские документы по...

3
1732 / 920 / 382
Регистрация: 11.10.2018
Сообщений: 4,801
26.03.2019, 18:05 2
Цитата Сообщение от mihakrvl Посмотреть сообщение
C++
1
static inline void merge(PolygonShader& ps, COLOR4& src_c, void* target)
- зачем тут inline писать, если функция явно не inline. Тем более, что если тут методы, то это явно класс. Да и static, наверное, больше к классу бы подошло нежели к структуре.
0
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 4
26.03.2019, 18:17  [ТС] 3
функция как раз инлайн, так как должна по плану встраиваться в другую функцию:

C++
1
2
3
4
5
6
7
8
9
10
    template<typename target_format, typename source, typename modulator, typename merger>
    static void shader(PolygonShader& ps, float x, VECTOR4& v, void* target)
    {       
        COLOR4 c;
        if(!source::get(ps, x, v, *((target_format*)target), c))
        {
            modulator::modulate(ps, c);
            merger::merge(ps, c, target);
        }
    }
merger может быть разным, в зависимости от способа блендинга
source тоже, может быть связано либо с сэмплером текстуры, либо просто с цветом
modulator тоже разный может быть, может умножать цвета на альфу как нужно, в зависимости от формата цвета (текстуры), наличия прозрачности и дополнительного цвета

в итоге по плану должно быть нагенерировано много функций "для всех случаев", может быть несколько сотен, главное чтобы inline работало... но оно, похоже не работет, и тогда нужно либо заставить его работать как-то, либо переходить на вызов функций по ссылкам
0
зомбяк
1532 / 1177 / 332
Регистрация: 14.05.2017
Сообщений: 3,822
26.03.2019, 19:20 4
Цитата Сообщение от mihakrvl Посмотреть сообщение
либо переходить на вызов функций по ссылкам
Вызовы функций по ссылкам или по указателям почти не отличаются от вызовов не-inline функций (если не хуже, т.к. ещё будет разыменовывание указателей на них).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2019, 19:20

Чем отличаются шаблоны HTML и шаблоны WordPress
В чём различие между шаблонами HTML и WordPress. Кроме того, что создаются они разными способами....

Шаблоны C++11
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt;...

Шаблоны
Добрый день. Не могли бы объяснить вот этот вопрос: Допускают ли шаблоны вложенность описания?

шаблоны
помогите с задачей пожалуйста нужно описать шаблон класса для хранения последовательности пар ключ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.