DGL
https://delphigl.com/forum/

Selection Operator ( ? : )
https://delphigl.com/forum/viewtopic.php?f=20&t=10779
Seite 1 von 1

Autor:  Bergmann89 [ So Mär 03, 2013 20:03 ]
Betreff des Beitrags:  Selection Operator ( ? : )

Hey,

ich hab grad ne seltsame Feststellung gemacht die ich mir nicht erklären kann.
Code:
  1.  
  2. //geht nich
  3.     gl_MaterialParameters mat = (s < 0) ? gl_BackMaterial : gl_FrontMaterial;
  4.  
  5. //geht
  6.     gl_MaterialParameters mat = gl_FrontMaterial;
  7.     if (s < 0){
  8.         mat = gl_BackMaterial;
  9.     }
  10.  

Der Shader wird ganz normal kompiliert und läuft auch ohne Fehler durch, doch beim zeichnen hab ich nur schwarze Objekte. Hat jmd ne Ahnung woran das liegt?

MfG Bergmann

Autor:  yunharla [ Mo Mär 04, 2013 09:28 ]
Betreff des Beitrags:  Re: Selection Operator ( ? : )

mhhh ja ich meine mich daran zu erinnern das der schon oefters Probleme gemacht hat. Es haengt wohl mit dem Pseudo-Branching der GPU zusammen ....
Theoretisch sollte aber dein zweiter Code sowieso "besser" sein da hier 3 statt 4 Befehle gebraucht werden. :mrgreen:

Autor:  Bergmann89 [ Mo Mär 04, 2013 17:05 ]
Betreff des Beitrags:  Re: Selection Operator ( ? : )

3 statt 4?! :shock: kannst du mir das mal vorzählen? ^^

Autor:  Sascha Willems [ Mo Mär 04, 2013 20:08 ]
Betreff des Beitrags:  Re: Selection Operator ( ? : )

Ich hab hier beide Varianten mal durch AMDs GPUAnalyzer mit ner 6870 als Ziel laufen lassen und bekomme jeweils den gleichen Assemblycode raus, sprich am Ende spielts keine Rolle welchen Code du benutzt. Auf welcher GPU hast du denn probiert?

yunharla hat geschrieben:
mhhh ja ich meine mich daran zu erinnern das der schon oefters Probleme gemacht hat. Es haengt wohl mit dem Pseudo-Branching der GPU zusammen ....
Theoretisch sollte aber dein zweiter Code sowieso "besser" sein da hier 3 statt 4 Befehle gebraucht werden.


Kannst du das belegen? Zumal "Psuedobranching" doch lange Geschichte ist, das war mal auf ner Radeon 9700 so weil dies nicht anders konnte, moderne GPUs können das durchaus.

Autor:  Bergmann89 [ Mo Mär 04, 2013 21:21 ]
Betreff des Beitrags:  Re: Selection Operator ( ? : )

Hey,

ich hab ne HD5970 hier. Treiber is v9.12.0.0.

MfG Bergmann.

Autor:  yunharla [ Di Mär 05, 2013 18:08 ]
Betreff des Beitrags:  Re: Selection Operator ( ? : )

Bergmann89 hat geschrieben:
3 statt 4?! :shock: kannst du mir das mal vorzählen? ^^


Nun ja ich mein natuerlich mit Pseudobranching sowas wie Conditional Move und co. Das ganze ist eigentlich nicht weiter dramatisch, du machst halt dein Vergleich und erhaelst dadurch entweder 1 oder 0 ist. Aus verschiedenen Gruenden ziehst nun davon 1 (also 0 oder -1 jetzt) ab und rufst dein Conditional Move (LessZero existiert immer! -> deswegen das -1).
Code:
  1.  
  2. init
  3. setcond
  4. sub
  5. movcond
  6.  


Im anderen Falle kannst du ja dein erstes Ergebniss schon beim Init uebergeben und musst daher nur einen Vergleich durchfuehren
Code:
  1.  
  2. init
  3. comp
  4. mov
  5.  

(deswegen auch setcond im ersten Fall da sonst 5 Befehle)

Das ist natuerlich nur die allgemeine Variante. Je nachdem was deine GPU bereitstellt und ob der Compiler nett ist wirds dir wie Sasha ergehen. Hier wuerde ich behaupten das der Compiler einfach erkennt das er in beiden Faellen
Code:
  1.  
  2. init
  3. movcond
  4.  

machen sollte.

Die dunkle Seite der Macht hatte ich mal auf meiner alten 7800 gs (man muss dazu wissen das es fuer jede Zeile des Vektors im einzelnen gilt):
Code:
  1.  
  2. init
  3. setcond
  4. sub
  5. movcond (a ??? b) ? truewert : -1
  6. movcond (vorher < 0) ? falswert : vorher
  7.  

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/