J'ai un problème et je n'arrive pas à en prendre la tête, alors j'espérais que quelqu'un puisse m'aider.Fragment ARB Si/Else
J'écris un compilateur pour miniGLSL, et jusqu'ici tout va bien. Je suis au point où j'ai besoin de sortie vers un programme de fragment ARB, mais le problème est que l'ARB que je dois cibler ne supporte pas le branchement. (Vous trouverez une liste complète des instructions prises en charge ici http://petewarden.com/notes/archives/2005/05/fragment_progra_2.html). Pour simuler if/else, j'ai utilisé le programme CMP comme suit (en supposant que 0 ou plus = true, sinon, false. // représente les commentaires comme # provoque un mauvais formatage ici):
if (a < b)
a = 1 + 1;
if (f < g)
c = 2 + 3;
else
if (h < i)
b = 1 + 2;
else
d = 2 + 3;
en fragment 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
C'est sur le point où je reçois avant que je réalise mon code va commencer à vraiment laid. Chaque niveau de if/else va introduire des comparaisons continuellement empilées, et en plus, le dernier nécessite de réévaluer cond2, ou d'utiliser un autre registre. Je sais que je fais probablement quelque chose de mal ici, mais je ne sais pas quoi. J'ai essayé d'utiliser des compteurs, j'ai essayé d'ajouter le résultat des étapes précédentes du bloc if/else, anding, oring, etc. mais je ne trouve pas de bonne solution pour convertir les blocs if/else en assembly ARB qui ne fonctionne pas. t sur des piles de plus en plus grandes d'instructions CMP. Quelqu'un a-t-il une idée sur la façon de rendre cela plus simple afin que mon compilateur puisse le faire par programmation? Je ne suis pas inquiet pour l'optimisation à ce stade, je veux juste que ça marche.
Merci