Értékadás
Ugyanúgy, ahogy C++-ban használtuk.
Szekvencia
{
statement 1;
statement 2;
...
statement n;
}
Ilyenkor az egyes blokkokban létrehozott változók, csak az adott blokkon belül látható. Ugyanúgy működik, mint C++-ban.
Elágazás
If szerkezet:
[Attribute] if ( Conditional )
{
Statement Block;
}
Működése ugyanúgy mint C++-ban.
Attribute – Opcionális. Megadható értéknek branch, ekkor lusta kiértékelést használ, flatten esetén pedig mohó kiértékelést. Default-ként lusta kiértékelést használ
Switch szerkezet:
[Attribute] switch( Selector ) {
case 0 :
{ StatementBlock; }
break;
case 1 :
{ StatementBlock; }
break;
case n :
{ StatementBlock; }
break;
default :
{ StatementBlock; }
break;
Attribute – branch, és flatten esetén ugyanaz mint az előzőnél. Lehet még forcecase, ilyenkor hardveren számolja a switch-et. Call esetén pedig szubrutin hívásokként kerülnek a hardverre a switch utasítások törzsei.
Például:
[branch] if( a == 2 )
return 3;
else if( a == 1 )
return 1;
else if( a == 0 )
return 0;
else
return 6;
Ciklus
Ugyanúgy működnek a ciklusok, ahogy C++-ban megszoktuk, apró különbséggel amit a következőekben részletezek.
Hátultesztelős:
do
{
Ciklusmag
}while(feltétel)
Előltesztelős:
[Attribute] while(feltétel)
{
Ciklusmag
}
Attribute – Opcionális. Értéke unroll(x) lehet, ekkor x helyére megadhatjuk, hogy maximum hány lépést mehet a ciklus
For ciklus:
[Attribute] for ( Initializer; Conditional; Iterator )
{
Ciklusmag
}
Attribute – Ugyanaz, mint az előzőnél.
Vezérlésátadó utasítások
break – hasonlóan a C++-hoz, itt is ciklus megszakítására lehet használni
continue – hasonlóan a C++-hoz, itt is a ciklus adott lépésének a megszakítása, és a következő lépés folytatására lehet használni
discard – csak a pixel shaderből hívható, az adott pixel értékét nem küldi tovább