A Cg programozási nyelv

Utasítások, vezérlési szerkezetek



Értékadás

Az értékadó utasítások szintaxisa az ANSI C szintaxist követik.

Az értékadás jobboldalán szereplő kifejezés automatikusan a baloldal típusára konvertálódik.

Az értékadás maga is kifejezés, értéke megegyezik a baloldalának az értékadás utáni értékével. Maga az értékadás nem balérték.

Értékadás bal oldalán nem szerepelhet const kulcsszóval deklarált vagy bármilyen sampler* típusú változó.

Szekvencia

Szekvencia létrehozása nem igényel külön jelölést. Egymás után írt, pontosvesszővel lezárt utasítások automatikusan szekvenciát alkotnak.

Megjegyzés: a pontosvessző lezárja az utasításokat, nem elválasztja, ezért minden utasítás után szerepelnie kell.

Elágazás

Az elágazás szintaxisa az ANSI C szintaxissal megegyező, de fordítás szempontjából eltérő.

A cél-platformtól függően, a használt profil határozza meg, hogy a platformon megvalósítható-e az elágazás. Amennyiben nem, a fordító megpróbálja átalakítani az elágazást olyan hosszabb műveletsorozattá, ami már végrehajtható a cél-platformon.

Ezt szemlélteti az alábbi egyszerű program:

void f(in float4 p : POSITION, out float4 q : POSITION, uniform bool b) { if (b) q = p; else q = 2*p; }

A fordítás eredménye elágazást támogató profil (vs_3_0) esetén:

test.cg 6 lines, 0 errors. vs_3_0 dcl_position o0 dcl_position v0 def c1, 0.000000, 2.000000, 0, 0 mov r0.x, c1 if_gt c0.x, r0.x mov o0, v0 else mul o0, v0, c1.y endif

Látható, hogy a kódban megjelennek az elágazásnak megfelelő alacsonyszintű utasítások.

Ugyanennek a kódnak a fordítási eredménye elágazást nem támogató profil (vs_1_1) esetén:

test.cg 6 lines, 0 errors. vs_1_1 def c1, 0.000000, 1.0000 mov r0.y, c0.x mov r0.x, c1 sge r0.y, c1.x, r0 sge r0.x, c0, r0 mul r0.x, r0, r0.y max r0.x, -r0, r0 slt r0.x, c1, r0 add r0.y, -r0.x, c1 mul r1, v0, r0.y mul r0, v0, r0.x mad oPos, r0, c1.z, r1

Itt a fordító bonyolult műveletsorozattal szimulálja az elágazás hatását.

A nyelvben case típusú elágazás nem használható.

Ciklus

A nyelvben a C-ből megszokott while és for ciklusok használhatóak. Az elágazáshoz hasonlóan szintaxisuk megegyezik az ANSI C szintaxisával, de használhatóságukat a profilok szabályozzák.

Újabb profilok mellett a ciklusok használhatók megkötés nélkül, de régebbi profil esetén a programban csak fordítási időben kifejthető ciklusok szerepelhetnek.

Fordítási időben nem kifejthető ciklusra példa az alábbi program:

void f(in float4 p : POSITION, out float4 q : POSITION) { while (p.x>0) { p.x -= 1; p.y *= p.y; } q = p; }

A fordítás eredménye ciklust támogató profil (vs_3_0) esetén:

test.cg 8 lines, 0 errors. vs_3_0 dcl_position v0 dcl_position o0 defi i0, 255, 0, 1, 0 def c0, 0.000000, -1.000000, 0, 0 mov r0, v0 loop aL, i0 break_le r0.x, c0.x mul r0.y, r0, r0 add r0.xzw, r0, c0.yyxx endloop mov o0, r0

Régebbi profil (vs_1_1) esetén a fordító hibát jelez:

test.cg test.cg(7) : error C5011: profile does not support "while" statements and "while" could not be unrolled. 8 lines, 1 errors.

Vezérlésátadó utasítások

Bár a goto, break és continue fenntartott szavakként szerepelnek a nyelvben, használatuk nem támogatott.