У меня есть проблема, и я, кажется, не могу обойти ее, поэтому я надеялся, что кто-то здесь сможет мне помочь.
Я пишу компилятор для miniGLSL, иВсе идет нормально.Я нахожусь в точке, где мне нужно вывести на фрагментную программу ARB, но проблема в том, что ARB, на которую я нацеливаюсь, не поддерживает ветвление.(Полный список поддерживаемых инструкций можно найти здесь http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html).
Чтобы смоделировать if / else, я использовал программу CMP следующим образом (при условии 0 или больше= true, в противном случае false. // представляет комментарии, поскольку # вызывает неправильное форматирование здесь):
if (a < b)
a = 1 + 1;
if (f < g)
c = 2 + 3;
else
if (h < i)
b = 1 + 2;
else
d = 2 + 3;
во фрагмент ARB:
TEMP cond1, cond2, cond3, tempvar1, tempvar2, tempvar3, tempvar4, a, b, c, d, e, f, g;
//TOP IF
//condition a < b
SLT a, b, cond1;
SUB cond1, 1.0, cond1;
//Assign if true
ADD 1.0, 1.0, tempvar1;
CMP cond1, a, tempvar1, a;
//Condition f < g
SLT f, g, cond2;
SUB cond2, 1.0, cond2;
//if top level if was false, assign false, otherwise assign it to itself
CMP cond1, -1.0, cond2, cond2;
//Assignment
ADD 2.0, 3.0, tempvar2;
CMP cond2, c, tempvar2, c;
//TOP ELSE
//if h < i
SLT h, i, cond2;
SUB cond2, 1.0, cond2;
//If top level if was true, make false
CMP cond1, cond2, -1.0, cond2;
CMP cond2, tempvar3, b, b;
//Else
//if top level if was true, and previous if was false, make true
Это то, что я получаю до того, какПонимаю, что мой код станет действительно ужасным.Каждый уровень if / else будет представлять непрерывное сравнение стеков, и, кроме того, последний уровень требует от меня переоценки cond2 или использования другого регистра.Я знаю, что, возможно, здесь что-то не так, но я не уверен, что.Я пытался использовать счетчики, пытался добавить результат предыдущих этапов блока if / else, anding, oring и т. Д., Но я не могу найти хорошее решение о том, как преобразовать блоки if / else в сборку фрагмента ARB, которая не 'на самом деле все больше и больше стеков CMP.У кого-нибудь есть идея, как сделать это проще, чтобы мой компилятор мог выводить это программно?На данный момент меня мало волнует оптимизация, я просто хочу, чтобы она заработала.
Спасибо