Formato codice byte AGAL

Il codice byte AGAL deve usare il formato Endian.LITTLE_ENDIAN.

Intestazione codice byte

Il codice byte AGAL deve iniziare con un'intestazione a 7 byte:

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

Offset (byte)

Dimensione (byte)

Nome

Descrizione

0

1

magic

deve essere 0xa0

1

4

versione

deve essere 1

5

1

ID tipo di shader

deve essere 0xa1

6

1

tipo di shader

0 per un programma di vertici e 1 per un programma di frammenti

Token

L'intestazione è immediatamente seguita da un qualsiasi numero di token. Ciascun token è di dimensioni pari a 192 bit (24 byte) ed è sempre nel formato:

[opcode][destination][source1][source2 o sampler]

Non ogni opcode usa tutti questi campi. I campi inutilizzati devono essere impostati su 0.

Codici operativi (opcode)

Il campo [opcode] è di dimensioni pari a 32 bit e può assumere uno dei seguenti valori:

Nome

Opcode

Operazione

Descrizione

mov

0x00

sposta

Sposta dati da source1 a destination, per singolo componente

add

0x01

aggiungi

destination = source1 + source2, per singolo componente

sub

0x02

sottrai

destination = source1 - source2, per singolo componente

mul

0x03

moltiplica

destination = source1 * source2, per singolo componente

div

0x04

dividi

destination = source1 / source2, per singolo componente

rcp

0x05

reciproco

destination = 1/source1, per singolo componente

min

0x06

minimo

destination = minimum(source1,source2), per singolo componente

max

0x07

massimo

destination = maximum(source1,source2), per singolo componente

frc

0x08

frazionario

destination = source1 - (float)floor(source1), per singolo componente

sqt

0x09

radice quadrata

destination = sqrt(source1), per singolo componente

rsq

0x0a

radice reciproca

destination = 1/sqrt(source1), per singolo componente

pow

0x0b

potenza

destination = pow(source1,source2), per singolo componente

log

0x0c

logaritmo

destination = log_2(source1), per singolo componente

exp

0x0d

esponenziale

destination = 2^source1, per singolo componente

nrm

0x0e

normalizza

destination = normalize(source1), per singolo componente (produce solo un risultato a 3 componenti; la destinazione deve essere mascherata con .xyz o con un valore inferiore)

sin

0x0f

seno

destination = sin(source1), per singolo componente

cos

0x10

coseno

destination = cos(source1), per singolo componente

crs

0x11

inter-prodotto

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

(produce solo un risultato a 3 componenti; la destinazione deve essere mascherata con .xyz o con un valore inferiore)

dp3

0x12

prodotto punto

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

dp4

0x13

prodotto punto

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

abs

0x14

assoluto

destination = abs(source1), per singolo componente

neg

0x15

negazione

destination = -source1, per singolo componente

sat

0x16

saturazione

destination = maximum(minimum(source1,1),0), per singolo componente

m33

0x17

matrice di moltiplicazione 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)

(produce solo un risultato a 3 componenti; la destinazione deve essere mascherta con .xyz o con un valore inferiore)

m44

0x18

matrice di moltiplicazione 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

matrice di moltiplicazione 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)

(produce solo un risultato a 3 componenti; la destinazione deve essere mascherta con .xyz o con un valore inferiore)

kil

0x27

distruggi/scarta (solo shader di frammenti)

Se un singolo componente di un'origine scalare è inferiore a zero, il frammento viene scartato e non viene disegnato nel buffer dei fotogrammi. (Il registro di destinazione deve essere impostato interamente su 0)

tex

0x28

campione di texture (solo shader di frammenti)

La destinazione corrisponde al carico della texture source2 alle coordinate source1. In questo caso, source2 deve essere in formato campionatore.

sge

0x29

imposta-se-maggiore-o-uguale

destination = source1 >= source2 ? 1 : 0, per singolo componente

slt

0x2a

imposta-se-minore-di

destination = source1 < source2 ? 1 : 0, per singolo componente

seq

0x2c

imposta-se-uguale

destination = source1 == source2 ? 1 : 0, per singolo componente

sne

0x2d

imposta-se-non-uguale

destination = source1 != source2 ? 1 : 0, per singolo componente

Formato campo di destinazione

Il campo [destination] ha una dimensione di 32 bit:

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

T = Tipo di registro (4 bit)

M = Maschera di scrittura (4 bit)

N = Numero registro (16 bit)

- = indefinito, deve essere 0

Formato campo di origine

Il campo [source] ha una dimensione di 64 bit:

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

D = Diretto=0/Indiretto=1 per diretto, Q e I sono ignorati, 1 bit

Q = Selezione componente registro indici (2 bit)

I = Tipo di registro indici (4 bit)

T = Tipo di registro (4 bit)

S = Swizzle (8 bit, 2 bit per componente)

O = Offset indiretto (8 bit)

N = Numero registro (16 bit)

- = indefinito, deve essere 0

Formato campo campionatore

Il secondo campo di origine del codice operativo tex deve essere nel formato [sampler], che ha una dimensione di 64 bit:

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

N = Numero registro sampler (16 bit)

B = Distorsione livello di dettaglio (LOD) texture, numero intero con segno, ridimensionare per 8. Il valore a virgola mobile utilizzato è b/8.0 (8 bit)

T = Tipo di registro, deve essere 5, sampler (4 bit)

F = Filtro (0=più vicino,1=lineare) (4 bit)

M = Mipmap (0=disabilita,1=più vicino, 2=lineare)

W = Wrapping (0=clamp,1=ripetizione)

S = Bit di flag speciali (deve essere 0)

D = Dimensione (0=2D, 1=Cubo)

Registri di programma

Sono definiti i seguenti tipi di registro. Utilizzate il valore indicato per specificare un tipo di registro nei campi di un token:

Nome

Valore

Numero per programma di frammenti

Numero per programma di vertici

Uso

Attributo

0

n/a

8

Input dello shader di vertici; letto da un buffer di vertici specificato con Context3D.setVertexBufferAt().

Costante

1

28

128

Input dello shader; impostato con la famiglia di funzioni Context3D.setProgramConstants()

Temporaneo

2

8

8

Registro temporaneo per il calcolo, non accessibile dall'esterno del programma

Output

3

1

1

Output dello shader: in un programma di vertici, l'output è la posizione dello spazio clip; in un programma di frammenti, l'output è un colore.

Variante

4

8

8

Trasferimento dei dati interpolati tra gli shader di vertici e di frammenti. I registri variabili del programma dei vertici vengono applicati come input al programma dei frammenti. I valori vengono interpolati in base alla distanza dai vertici del triangolo.

Campionatore

5

8

n/a

Input dello shader di frammenti; letto da una texture specificata con Context3D.setTextureAt().