2010-12-01 69 views
0

我有一個問題,我似乎無法把頭圍住它,所以我希望有人能在這裏幫助我。ARB Fragment If/Else

我正在爲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塊的先前階段的結果,以及oring等,但我無法找到一個很好的解決方案,以便如何將if/else塊轉換爲ARB碎片組合體,實際上越來越多的CMP語句堆積如山。有沒有人有一個想法如何使這個更簡單,所以我的編譯器可以輸出這個編程?在這一點上,我並不擔心優化問題,我只是想讓它工作。

感謝

回答

0

在uoft原因,如果你在你的類的IM笑採取csc467。

所以這是我認爲這應該實現的,我只是想過它,所以不知道它的corrext。

示例: 如果(a < b) a = 1 + 1; (f <g) c = 2 + 3; else if(h < i) b = 1 + 2; else d = 2 + 3;

,從我讀到這裏http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/ 可以翻轉的輸入的跡象,但如果沒有的話,那麼我的想法是垃圾

firstIf:

//計算條件 SLT A,B ,condition1;

//計算表達式1 + 1它不會更改任何寄存器 ADD 1,1,temp; CMP -condition,溫度,A,A //如果條件爲真 - (條件)= -1 //所以你存儲1 + 1在其他你存儲在

secondIf:

//計算條件 SLT f,g,condition2;

//現在,因爲你已經previus CONDITION1你需要把它們加在一起,如果都是真 //才執行鱈魚

TEMP combinedCon1; TEMP temp2 = {2.0}; ADD條件1,條件2,combinedCon1;
SGE combinedCon1,TEMP2,combinedCon1 //如果兩個subexpresiions相加== 2 //然後1否則爲0

//計算2 + 3 ADD 2,圖3,溫度;

//執行賦值如果combineCon1 == 1 CMP -combineCon1,temp,c,c;

//現在你可以用CMP指令別人這樣做遵循相同的步驟,只是交換了一些東西,

所以舉例來說,如果你有(「其他A = 2」);它的CMP -condition1,a,temp,a; 而不是CMP -condition1,temp,a,a;

//所以希望這每一個你另一個嵌套條件你必須& &他們在CMP指令使用結果的時間工作這麼..

我認爲這應該工作,不知道