2010-12-01 8 views
0

私は問題があり、私はそれの周りに私の頭を包んでいるように見えることができないので、私はここで誰かが私を助けることができるかもしれないことを望んでいた。ARB Fragment If/Else

私はminiGLSL用のコンパイラを作成しています。私はARBフラグメントプログラムに出力する必要があるところですが、問題は、ターゲットにしなければならないARBが分岐をサポートしていないことです。 (サポートされる指示の完全なリストはhttp://petewarden.com/notes/archives/2005/05/fragment_progra_2.htmlでここに見つけることができる)。

私はCMPプログラムを次のように使用しています(0以上はtrue、それ以外の場合はfalse)。#はコメントのため、ここでフォーマットが悪い#

ARBフラグメントに
if (a < b) 
    a = 1 + 1; 
    if (f < g) 
    c = 2 + 3; 
else 
    if (h < i) 
    b = 1 + 2; 
    else 
    d = 2 + 3; 

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の各レベルは積み上げ比較を継続的に導入する予定であり、さらに最後のelseはcond2を再評価するか、別のレジスタを使用する必要があります。私はおそらくここで何か間違っていることを知っているが、私は何が分からない。私はカウンターを使って試して、if/elseブロック、anding、oringなどの前のステージの結果を追加しようとしましたが、if/elseブロックをARBフラグメントアセンブリに変換する方法については、 CMPステートメントのスタックがますます大きくなっています。どのように私のコンパイラがこれをプログラムで出力できるように、これをよりシンプルにするか考えている人はいますか?私はこの時点で最適化についてはあまり心配していません、私はちょうどそれを働かせたいです。

ありがとう

答えて

0

あなたがあなたのクラスにいるならば、

これは私がこれを実装すべきだと思う方法です、私はそれについて考えました。

例: if(a <b) a = 1 + 1; if(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を計算します、条件1;

//式1 + 1を計算すると、いずれのレジスタも変更されません。 ADD 1、1、temp; のCMP -condition、一時、//条件が真だった場合 - (条件)= -1 //あなたが他に1 + 1を保存するように、あなたは

secondIfに格納します。

//計算条件 SLT f、g、condition2;今

//あなたは両方に該当する場合 //だけにして、タラ

TEMPをcombinedCon1実行し、それらを一緒に追加する必要がありprevius条件1を持っていたので。 TEMP temp2 = {2.0}; ADD条件1、条件2、結合Con1;
SGE combinedCon1、TEMP2は、combinedCon1 // 2 subexpresiionsは//次に== 2そうでなければ1 0

// 2 + 3 ADD 2、3、TEMPを計算一緒に追加した場合。

// combineCon1 == 1の場合、代入を実行します。 CMP -combineCon1、temp、c、c;

//今、あなたは(「他= 2」)している場合ので、たとえばので

、唯一のいくつかのことを入れ替えると同じ手順に従ってくださいCMP命令で他に行うことができます。そのCMP-condition1、a、temp、a; CMP-condond1、temp、a、aの代わりに ;

//ので、うまくいけば、これはあなたが& &彼らはにあなたが持っている別のネストされた条件を持っているし、CMP命令で結果を使用するたびに動作します。..

私は、これは動作するはずだと思う、ないように注意してください