ARB Fragment If / Else - PullRequest
       17

ARB Fragment If / Else

0 голосов
/ 02 декабря 2010

У меня есть проблема, и я, кажется, не могу обойти ее, поэтому я надеялся, что кто-то здесь сможет мне помочь.

Я пишу компилятор для 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.У кого-нибудь есть идея, как сделать это проще, чтобы мой компилятор мог выводить это программно?На данный момент меня мало волнует оптимизация, я просто хочу, чтобы она заработала.

Спасибо

1 Ответ

0 голосов
/ 02 декабря 2010

принимают csc467 по неосторожности, если вы в вашем классе, лол.

Так вот, как я думаю, это должно быть реализовано, я просто подумал об этом, поэтому не уверен, что это корректно.

пример: if (a и из того, что я прочитал здесь http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/, вы можете перевернуть знак ввода, но если это не так, то моя идея - мусор

firstIf:

// вычислить условие SLT a, b, условие1;

// вычислить выражение 1 + 1, оно не изменяет ни один из регистров ADD 1, 1, temp;cmp -условие, temp, a, a // если условие было истинным - (условие) = -1 <0 // таким образом, вы сохраняете 1 + 1 в другом, а вы сохраняете в </p>

secondIf:

// вычисляем условие SLT f, g, condition2;

// теперь, поскольку у вас было предусловие1, вам нужно сложить их вместе, если оба они истинны, // только тогда выполнить cod

TEMP комбинированныйCon1;TEMP temp2 = {2.0};ДОБАВИТЬ условие1, условие2, комбинированныйCon1;
SGE комбинированныйCon1, temp2, комбинированныйCon1 // если два подвыражения сложены вместе == 2 // затем 1 иначе 0

// вычислить 2 + 3 ADD 2, 3,temp;

// выполнить присваивание, если объединитьCon1 == 1 CMP -combineCon1, temp, c, c;

// теперь вы можете делать что-то еще с инструкцией CMP, поэтому следуйте тем же шагам только для обменанесколько вещей,

так, например, если у вас есть ("иначе a = 2");его CMP -условие 1, a, temp, a;вместо CMP -условия1, temp, a, a;

// надеюсь, это сработает, поэтому каждый раз, когда у вас появляется другое вложенное условие, вы должны & && их использовать и использовать результат в инструкции CMP ..

Я думаю, что это должно работать, не уверен

...