Bytekodsformatet AGAL

För AGAL-bytekod måste formatet Endian.LITTLE_ENDIAN användas.

Bytekodsrubrik

AGAL-bytekoden måste börja med en sjubytesrubrik:

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

Förskjutning (byte)

Storlek (byte)

Namn

Beskrivning

0

1

magic

måste vara 0xa0

1

4

version

måste vara 1

5

1

ID för skuggningstyp

måste vara 0xa1

6

1

skuggningstyp

0 för ett vertex-program; 1 för ett fragment-program

Token

Rubriken följs av ett godtyckligt antal token. Varje token är 192 bitar (24 byte) och har alltid formatet:

[opkod][mål][källa1][källa2 eller sampler]

Alla opkoder använder inte alla dessa fält. Oanvända fält måste vara 0.

Åtgärdskoder

Fältet [opkod] är 32 bitar och kan anta ett av dessa värden:

Namn

Opkod

Åtgärd

Beskrivning

mov

0x00

move

flytta från källa1 till mål, komponentvis

add

0x01

lägg till (add)

mål = källa1 + källa2, komponentvis

sub

0x02

minus (subtract)

mål = källa1 - källa2, komponentvis

mul

0x03

multiplicera

mål = källa1 * källa2, komponentvis

div

0x04

dividera

mål = källa1 / källa2, komponentvis

rcp

0x05

reciprokt (reciprocal)

mål = 1/källa1, komponentvis

min

0x06

minimum

mål = minimum(källa1, källa2), komponentvis

max

0x07

maximum

mål = maximum(källa1, källa2), komponentvis

frc

0x08

bråk (fractional)

mål = källa1 - (float)floor(källa1), komponentvis

sqt

0x09

kvadratrot (square root)

mål = sqrt(källa1), komponentvis

rsq

0x0a

reciprokt rot (reciprocal root)

mål = 1/sqrt(källa 1), komponentvis

pow

0x0b

potens (power)

mål = pow(källa1, källa2), komponentvis

log

0x0c

logaritm

mål = log_2(källa1), komponentvis

exp

0x0d

exponent

mål = 2^källa1, komponentvis

nrm

0x0e

normalize

mål = normalize(källa1), komponentvis (resulterar endast i ett 3-komponentsresultat, mål måste maskeras till .xyz eller mindre)

sin

0x0f

sinus

mål = sin(källa1), komponentvis

cos

0x10

cosinus

mål = cos(källa1), komponentvis

crs

0x11

summaprodukt (cross product)

mål.x = källa1.y * källa2.z - källa1.z * källa2.y

mål.y = källa1.z * källa2.x - källa1.x * källa2.z

mål.z = källa1.x * källa2.y - källa1.y * källa2.x

(Resulterar endast i ett 3-komponentsresultat, mål måste maskeras till .xyz eller mindre)

dp3

0x12

punktprodukt (dot product)

mål = källa1.x*källa2.x + källa1.y*källa2.y + källa1.z*källa2.z

dp4

0x13

punktprodukt (dot product)

mål = källa1.x*källa2.x + källa1.y*källa2.y + källa1.z*källa2.z + källa1.w*källa2.w

abs

0x14

absolut

mål = abs(källa1), komponentvis

neg

0x15

negera

mål = källa1, komponentvis

sat

0x16

saturnera

mål = maximum(minimum(källa1,1),0), komponentvis

m33

0x17

multipliceringsmatris 3x3

mål.x = (källa1.x * källa2[0].x) + (källa1.y * källa2[0].y) + (källa1.z * källa2[0].z)

mål.y = (källa1.x * källa2[1].x) + (källa1.y * källa2[1].y) + (källa1.z * källa2[1].z)

mål.z = (källa1.x * källa2[2].x) + (källa1.y * källa2[2].y) + (källa1.z * källa2[2].z)

(Resulterar endast i ett 3-komponentsresultat, mål måste maskeras till .xyz eller mindre)

m44

0x18

multipliceringsmatris 4x4

mål.x = (källa1.x * källa2[0].x) + (källa1.y * källa2[0].y) + (källa1.z * källa2[0].z) + (källa1.w * källa2[0].w)

mål.y = (källa1.x * källa2[1].x) + (källa1.y * källa2[1].y) + (källa1.z * källa2[1].z) + (källa1.w * källa2[1].w)

mål.z = (källa1.x * källa2[2].x) + (källa1.y * källa2[2].y) + (källa1.z * källa2[2].z) + (källa1.w * källa2[2].w)

mål.w = (källa1.x * källa2[3].x) + (källa1.y * källa2[3].y) + (källa1.z * källa2[3].z) + (källa1.w * källa2[3].w)

m34

0x19

multipliceringsmatris 3x4

mål.x = (källa1.x * källa2[0].x) + (källa1.y * källa2[0].y) + (källa1.z * källa2[0].z) + (källa1.w * källa2[0].w)

mål.y = (källa1.x * källa2[1].x) + (källa1.y * källa2[1].y) + (källa1.z * källa2[1].z) + (källa1.w * källa2[1].w)

mål.z = (källa1.x * källa2[2].x) + (källa1.y * källa2[2].y) + (källa1.z * källa2[2].z) + (källa1.w * källa2[2].w)

(Resulterar endast i ett 3-komponentsresultat, mål måste maskeras till .xyz eller mindre)

kil

0x27

avbryt/förkasta (endast fragmentskuggning) (kill)

Om en skalärkällkomponent är mindre än noll, förkastas fragment och dras inte till bildrutebufferten. (Målregistret måste vara 0)

tex

0x28

texturexempel (endast fragmentskuggning)

destination lika med inläsning från textur källa2 vid koordinaterna källa1. I detta fall måste källa2 ha ett sampler-format

sge

0x29

ange om större än eller lika med (set-if-greater-equal)

mål = källa1 >= källa2 ? 1 : 0, komponentvis

slt

0x2a

ange om mindre än (set-if-less-than)

mål = källa1 < källa2 ? 1 : 0, komponentvis

seq

0x2c

ange om lika med (set-if-equal)

mål = källa1 == källa2 ? 1 : 0, komponentvis

sne

0x2d

ange om inte lika med (set-if-not-equal)

mål = källa1 != källa2 ? 1 : 0, komponentvis

Följande opkoder har lagts till i AGAL2:

Namn

Opkod

Åtgärd

Beskrivning

ddx

0x1a

partiell derivata i X

Läs in partiell derivata i X för källa1 till målet.

ddy

1x0b

partiell derivata i Y

Läs in partiell derivata i Y för källa1 till målet.

ife

0x1c

om lika med

Hoppa om källa1 är lika med källa2.

ine

0x1d

om inte lika med

Hoppa om källa1 inte är lika med källa2.

ifg

1x0e

om större än

Hoppa om källa1 är större än eller lika med källa2.

ifl

1x0f

om mindre än

Hoppa om källa1 är mindre än källa2.

els

0x20

else

Om inte, blockera

eif

0x21

Endif

Stäng om sant, om inte blockera.

Format för målfält

Fältet [mål] är 32 bitar stort:

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

T = Registertyp (4 bitar)

M = Skrivmask (4 bitar)

N = Registernummer (16 bitar)

- = odefinierad, must be 0

Format för källfält

Fältet [källa] är 64 bitar stort:

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

D = Direkt=0/Indirekt=1 för direkt Q och I ignoreras, 1 bit

Q = Val av indexregisterkomponent (2 bitar)

I = Indexregistertyp (4 bitar)

T = Registertyp (4 bitar)

S = Swizzle (8 bitar, 2 bitar per komponent)

O = Indirekt förskjutning (8 bitar)

N = Registernummer (16 bitar)

- = odefinierad, must be 0

Format för samplerfält

Det andra källfältet för tex-opkoden måste ha formatet [sampler], som är 64 bitar stort:

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

N = Samplerregisternummer (16 bitar)

B = LOD-avvikelse (level-of-detail) för textur, heltal med tecken, skala med 8. Flyttalet som används b/8.0 (8 bitar)

T = Registertyp, måste vara 5, sampler (4 bitar)

F = Filter (0=närmast, 1=linjär) (4 bitar)

M = Mipmap (0=inaktiverad, 1=närmast, 2=linjär)

W = Brytning (0=begränsning, 1=upprepa)

S = Specialflaggsbitar (måste vara 0)

D = Dimension (0=2D, 1=Kub)

Programregister

Antalet använda register beror på den profil som används för Context3D. Antalet register tillsammans med deras användning definieras i följande tabell:

Namn

Värde

AGAL

AGAL2

AGAL3

Användning

Antal per fragment-program

Antal per vertex-program

Antal per fragment-program

Antal per vertex-program

Antal per fragment-program

Antal per vertex-program

Stöd för Context3D-profiler

Under standard

Standard

Utökad standard

SWF-version

Under 25

25

28 och över

Attribut

0

NA

8

NA

8

NA

16

Vertex-skuggningsindata; läs från en vertex-buffert angiven med Context3D.setVertexBufferAt().

Konstant

1

28

128

64

250

200

250

Skuggningsindata; ställ in med funktionsfamiljen Context3D.setProgramConstants().

Tillfällig

2

8

8

26

26

26

26

Tillfälligt register för beräkning, inte åtkomligt utanför program.

Utdata

3

1

1

1

1

1

1

Skuggningsindata: i ett vertex-program är utdata klipputrymmespositionen; i ett fragment-program är utdata en färg.

Varierande

4

8

8

10

10

10

10

Överför interpolerade data mellan vertex- och fragment-skuggningsprogram. De varierande registren från vertex-programmet tillämpas som indata för fragment-programmet. Värden interpoleras enligt avståndet från triangelhörnpunkterna.

Sampler

5

8

NA

16

NA

16

NA

Fragment-skuggningsindata; läs från en textur angiven med Context3D.setTextureAt().

Fragmentregister

6

NA

NA

1

NA

1

NA

Endast skrivbar och används för att skriva om z-värdet (eller djupvärdet) som skrivs för vertexskuggning.

Token

200

1024

2048

Den senaste AGAL-miniassembleraren finns här .