Format kodu bajtowego AGAL

Kod bajtowy AGAL musi korzystać z formatu Endian.LITTLE_ENDIAN.

Nagłówek kodu bajtowego

Kod bajtowy AGAL musi zaczynać się od 7-bajtowego nagłówka:

A0 01000000 A1 00 -- for a vertex program 
A0 01000000 A1 01 -- for a fragment program

Przesunięcie (w bajtach)

Rozmiar (w bajtach)

Nazwa

Opis

0

1

magic

Musi mieć wartość „0xa0”.

1

4

Wersja

Musi mieć wartość 1.

5

1

Identyfikator typu modułu cieniującego

Musi mieć wartość „0xa1”.

6

1

Typ modułu cieniującego

0 dla programu wierzchołków; 1 dla programu fragmentów

Znaczniki

Bezpośrednio po nagłówku znajduje się dowolna liczba znaczników. Każdy znacznik ma rozmiar 192 bitów (24 bajtów) i zawsze występuje w następującym formacie:

[opcode][destination][source1][source2 lub sampler]

Nie w każdym elemencie opcode są stosowane wszystkie te pola. W każdym nieużytym polu musi być ustawiona wartość 0.

Kody operacji

Pole [opcode] ma rozmiar 32 bitów i może przyjąć jedną z następujących wartości:

Nazwa

Kod operacji

Operacja

Opis

mov

0x00

move

Przenosi dane z parametru source1 do parametru destination, według składowych

add

0x01

add

destination = source1 + source2, według składowych

sub

0x02

subtract

destination = source1 – source2, według składowych

mul

0x03

multiply

destination = source1 * source2, według składowych

div

0x04

divide

destination = source1 / source2, według składowych

rcp

0x05

reciprocal

destination = 1 / source1, według składowych

min.

0x06

minimum

destination = minimum(source1,source2), według składowych

max

0x07

maximum

destination = maximum(source1,source2), według składowych

frc

0x08

fractional

destination = source1 – (float)floor(source1), według składowych

sqt

0x09

square root

destination = sqrt(source1), według składowych

rsq

0x0a

reciprocal root

destination = 1 / sqrt(source1), według składowych

pow

0x0b

power

destination = pow(source1,source2), według składowych

log

0x0c

logarithm

destination = log_2(source1), według składowych

exp

0x0d

exponential

destination = 2^source1, według składowych

nrm

0x0e

normalize

destination = normalize(source1), według składowych (generuje wynik złożony tylko z 3 składników; miejsce docelowe musi być zamaskowane nie bardziej niż na pozycjach .xyz)

sin

0x0f

sine

destination = sin(source1), według składowych

cos

0x10

cosine

destination = cos(source1), według składowych

crs

0x11

cross product

destination.x = source1.y * source2.z – source1.z * source2.y

destination.y = source1.z * source2.x – source1.x * source2.z

destination.z = source1.x * source2.y – source1.y * source2.x

Generuje produkt złożony tylko z 3 składników, miejsce docelowe musi być zamaskowane nie bardziej niż na pozycjach .xyz.

dp3

0x12

dot product

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z

dp4

0x13

dot product

destination = source1.x*source2.x + source1.y*source2.y + source1.z*source2.z + source1.w*source2.w

abs

0x14

absolute

destination = abs(source1), według składowych

neg

0x15

negate

destination = –source1, według składowych

sat

0x16

saturate

destination = maximum(minimum(source1,1),0), według składowych

m33

0x17

multiply matrix 3x3

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z)

Generuje produkt złożony tylko z 3 składników, miejsce docelowe musi być zamaskowane nie bardziej niż na pozycjach .xyz.

m44

0x18

multiply matrix 4x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

destination.w = (source1.x * source2[3].x) + (source1.y * source2[3].y) + (source1.z * source2[3].z) + (source1.w * source2[3].w)

m34

0x19

multiply matrix 3x4

destination.x = (source1.x * source2[0].x) + (source1.y * source2[0].y) + (source1.z * source2[0].z) + (source1.w * source2[0].w)

destination.y = (source1.x * source2[1].x) + (source1.y * source2[1].y) + (source1.z * source2[1].z) + (source1.w * source2[1].w)

destination.z = (source1.x * source2[2].x) + (source1.y * source2[2].y) + (source1.z * source2[2].z) + (source1.w * source2[2].w)

Generuje produkt złożony tylko z 3 składników, miejsce docelowe musi być zamaskowane nie bardziej niż na pozycjach .xyz.

kil

0x27

kill/discard (tylko moduł cieniujący fragmentów)

Jeśli pojedynczy skalarny składnik źródłowy jest mniejszy niż zero, fragment jest odrzucany i nie jest rysowany do bufora ramki. (Rejestr miejsca docelowego musi być ustawiony na same 0).

tex

0x28

texture sample (tylko moduł cieniujący fragmentów)

Wartość destination jest równa wartości wczytanej z tekstury source2 o współrzędnych source1. W tym przypadku parametr source2 musi mieć format próbnika.

sge

0x29

set-if-greater-equal

destination = source1 >= source2 ? 1 : 0, według składowych

slt

0x2a

set-if-less-than

destination = source1 < source2 ? 1 : 0, według składowych

seq

0x2c

set-if-equal

destination = source1 == source2 ? 1 : 0, według składowych

sne

0x2d

set-if-not-equal

destination = source1 != source2 ? 1 : 0, według składowych

W specyfikacji AGAL2 wprowadzono następujące kody operacji:

Nazwa

Kod operacji

Operacja

Opis

ddx

0x1a

pochodna częściowa w x

Wczytuje pochodną częściową x wartości source1 do elementu docelowego.

ddy

1x0b

pochodna częściowa w y

Wczytuje pochodną częściową y wartości source1 do elementu docelowego.

ife

0x1c

jeśli równy

Skok, jeśli source1 równa się source2.

ine

0x1d

jeśli nie równy

Skok, jeśli source1 nie równa się source2.

ifg

1x0e

jeśli większy niż

Skok, jeśli wartość source1 jest większa lub równa względem wartości source2.

ifl

1x0f

jeśli mniejszy niż

Skok, jeśli wartość source1 jest mniejsza niż wartość source2.

els

0x20

w innym przypadku

Blok else (druga alternatywa) w instrukcji warunkowej.

eif

0x21

koniec warunku

Zamknięcie bloku instrukcji warunkowej (if lub else).

Format pola destination

Pole [destination] ma rozmiar 32 bity:

31.............................0 
----TTTT----MMMMNNNNNNNNNNNNNNNN

T = typ rejestru (4 bity)

M = maska zapisu (4 bity)

N = numer rejestru (16 bitów)

– = niezdefiniowane, musi być równe 0

Format pola source

Pole [source] ma rozmiar 64 bity:

63.............................................................0 
D-------------QQ----IIII----TTTTSSSSSSSSOOOOOOOONNNNNNNNNNNNNNNN

D = bezpośrednie=0/pośrednie=1; w przypadku opcji „bezpośrednie” informacje Q oraz I są ignorowane (1 bit)

Q = wybór składnika rejestru indeksu (2 bity)

I = typ rejestru indeksu (4 bity)

T = typ rejestru (4 bity)

S = zmiana kolejności (8 bitów, 2 bity na składnik)

O = przesunięcie pośrednie (8 bitów)

N = numer rejestru (16 bitów)

– = niezdefiniowane, musi być równe 0

Format pola sampler

Drugie pole źródłowe dla kodu operacji tex musi mieć format [sampler] o rozmiarze 64 bity:

63.............................................................0 
FFFFMMMMWWWWSSSSDDDD--------TTTT--------BBBBBBBBNNNNNNNNNNNNNNNN

N = numer rejestru próbnika (16 bitów)

B = odchylenie poziomu szczegółów (LOD, level-of-detail) tekstury, liczba całkowita ze znakiem, współczynnik skalowania: 8. Stosowana jest wartość zmiennoprzecinkowa b/8,0 (8 bitów).

T = typ rejestru, musi być równy 5 — próbnik (4 bity)

F = filtrowanie (0=najbliższe,1=liniowe) (4 bity)

M = mipmapa (0=wyłączone,1=najbliższe, 2=liniowe)

W = zawijanie (0=ściskanie,1=powtarzanie)

S = bity flag specjalnych (muszą być równe 0)

D = wymiar (0=2D, 1=sześcienny)

Rejestry programu

Liczba używanych rejestrów zależy od używanego profilu Context3D. Liczby rejestrów oraz sposoby ich użycia zdefiniowano w poniższej tabeli:

Nazwa

Wartość

AGAL

AGAL2

AGAL3

Zastosowanie

Liczba dla programu fragmentów

Liczba dla programu wierzchołków

Liczba dla programu fragmentów

Liczba dla programu wierzchołków

Liczba dla programu fragmentów

Liczba dla programu wierzchołków

Obsługa profilów kontekstu 3D

Poniżej standardu

Standard

Standard rozszerzony

Wersja SWF

Poniżej 25

25

28 i więcej

Atrybut

0

Niedostępne

8

Niedostępne

8

Niedostępne

16

Dane wejściowe modułu cieniującego wierzchołków; odczytywane z bufora wierzchołków określonego przy użyciu funkcji Context3D.setVertexBufferAt().

Stała

1

28

128

64

250

200

250

Dane wejściowe modułu cieniującego; ustawiane przy użyciu rodziny funkcji Context3D.setProgramConstants().

Tymczasowy

2

8

8

26

26

26

26

Tymczasowy rejestr na potrzeby obliczeń. Nie jest dostępny spoza programu.

Wyjście

3

1

1

1

1

1

1

Dane wyjściowe modułu cieniującego: danymi wyjściowymi programu wierzchołków jest położenie przestrzeni przycinania; danymi wyjściowymi programu fragmentów jest kolor.

Różnicowanie

4

8

8

10

10

10

10

Umożliwiają przekazywanie interpolowanych danych między modułami cieniującymi wierzchołków i fragmentów. Różne rejestry z programu wierzchołków są stosowane jako dane wejściowe programu fragmentów. Wartości są interpolowane zgodnie z odległością od wierzchołków trójkąta.

Próbnik

5

8

Niedostępne

16

Niedostępne

16

Niedostępne

Dane wejściowe modułu cieniującego fragmentów; odczytywane z tekstury określonej za pomocą funkcji Context3D.setTextureAt().

Rejestr fragmentów

6

Niedostępne

Niedostępne

1

Niedostępne

1

Niedostępne

Tylko do zapisu. Służy do ponownego zapisywania wartości z (głębokości) modułu cieniowania wierzchołków.

Znaczniki

200

1024

2048

Najnowszy mini asembler AGAL jest dostępny tutaj .