我有一个问题,我似乎无法绕过它,所以我希望有人可以帮助我。
我正在为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语句堆栈上。有没有人知道如何使这更简单,所以我的编译器可以以编程方式输出?我现在并不担心优化问题,我只想让它发挥作用。
由于
答案 0 :(得分:0)
正在uoft引用csc467。
所以这就是我认为应该如何实现的,我只是考虑了它,所以不确定它的相关文件。
例如:
if(a&lt; b)
a = 1 + 1;
如果(f 从我在这里阅读http://www.cs.uaf.edu/~olawlor/ref/gl/glfp/
你可以翻转一个输入的符号,但如果不是这样,那么我的想法就是垃圾 firstIf: //计算条件
SLT a,b,condition1; //计算表达式1 + 1它不会改变任何寄存器
ADD 1,1,temp;
cmp -condition,temp,a,a //如果condition为true - (condition)= -1&lt; 0
//所以你将1 + 1存储在一个 secondIf: //计算条件
SLT f,g,condition2; //现在,因为你有previus condition1,如果两者都是真的,你需要将它们加在一起
//然后才执行cod TEMP combinedCon1;
TEMP temp2 = {2.0};
ADD condition1,condition2,combinedCon1; //计算2 + 3
ADD 2,3,temp; //如果combineCon1 == 1,则执行赋值
CMP -combineCon1,temp,c,c; //现在你可以用CMP指令做其他事情,所以按照相同的步骤只交换一些东西, 所以例如,如果你有(“否则a = 2”);它的CMP -condition1,a,temp,a;
而不是CMP -condition1,temp,a,a; //所以希望这样可行,所以每当你有另一个嵌套条件时,你必须&amp;&amp;它们并在CMP指令中使用结果.. 我认为这应该有用,不确定
SGE combinedCon1,temp2,combinedCon1 //如果两个子表达式加在一起== 2 //那么1其他0