Formato de código de byte AGAL

O código de bytes AGAl deve usar o formato Endian.LITTLE_ENDIAN.

Cabeçalho do código de bytes

O código de bytes AGAL deve começar com um cabeçalho de 7 bytes:

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

Deslocamento (bytes)

Tamanho (bytes)

Nome

Descrição

0

1

magia

deve ser 0xa0

1

4

versão

deve ser 1

5

1

ID do tipo de sombreador

deve ser 0xa1

6

1

tipo de sombreador

0 para um programa de vértice; 1 para um programa de fragmento

Símbolos

O cabeçalho é imediatamente seguido por qualquer número de símbolos. Cada símbolo tem o tamanho de 192 bits (24 bytes) e sempre tem o formato:

[opcode][destino][origem1][origem2 ou classificador]

Nem todos os opcodes usam todos esses campos. Os campos não utilizados devem ser definidos como 0.

Códigos de operação

O campo [opcode] tem 32 bits de tamanho e pode assumir um destes valores:

Nome

Opcode

Operação

Descrição

mov

0x00

move

move os dados de origem1 para destino, em nível de componente

add

0x01

add

destino = origem1 + origem2, em nível de componente

abaixo

0x02

subtract

destino = origem1 - origem2, em nível de componente

mul

0x03

multiplicar

destino = origem1 * origem2, em nível de componente

div

0x04

dividir

destino = origem1 / origem2, em nível de componente

rcp

0x05

recíproco

destino = 1/origem1, em nível de componente

mín.

0x06

mínimo

destino = mínimo (origem1, origem2), em nível de componente

máx.

0x07

maximum

destino = máximo (origem1, origem2), em nível de componente

frc

0x08

fracionário

destino = origem1 - base (flutuante) (origem1), em nível de componente

sqt

0x09

raiz quadrada

destino = sqrt (origem1), em nível de componente

rsq

0x0a

raiz recíproca

destino = 1/sqrt (origem1), em nível de componente

pow

0x0b

potência

destino = pow (origem1, origem2), em nível de componente

log

0x0c

logaritmo

destino = log_2 (origem1), em nível de componente

exp

0x0d

exponencial

destino = 2^origem1, em nível de componente

nrm

0x0e

normalize

destino = normalização (origem1), em nível de componente (produz só um resultado de três componentes; o destino deve ser mascarado como .xyz ou menos)

sen

0x0f

seno

destino = sen (origem1), em nível de componente

cos

0x10

cosseno

destino = cos (origem1), em nível de componente

crs

0x11

produto vetorial

destino.x = origem1.y * origem2.z - origem1.z * origem2.y

destino.y = origem1.z * origem2.x - origem1.x * origem2.z

destino.z = origem1.x * origem2.y - origem1.y * origem2.x

(produz só um resultado de 3 componentes; o destino deve ser mascarado como .xyz ou menos)

dp3

0x12

produto de ponto

destino = origem1.x*origem2.x + origem1.y*origem2.y + origem1.z*origem2.z

dp4

0x13

produto de ponto

destino = origem1.x*origem2.x + origem1.y*origem2.y + origem1.z*origem2.z + origem1.w*origem2.w

abs

0x14

absoluto

destino = abs(origem1), em nível de componente

neg

0x15

negar

destino = -origem1, em nível de componente

sat

0x16

saturar

destino = máximo (mínimo (origem1,1), 0), em nível de componente

m33

0x17

matriz de multiplicação 3x3

destino.x = (origem1.x * origem2[0].x) + (origem1.y * origem2[0].y) + (origem1.z * origem2[0].z)

destino.y = (origem1.x * origem2[1].x) + (origem1.y * origem2[1].y) + (origem1.z * origem2[1].z)

destino.z = (origem1.x * origem2[2].x) + (origem1.y * origem2[2].y) + (origem1.z * origem2[2].z)

(produz só um resultado de 3 componentes; o destino deve ser mascarado como .xyz ou menos)

m44

0x18

matriz de multiplicação 4x4

destino.x = (origem1.x * origem2[0].x) + (origem1.y * origem2[0].y) + (origem1.z * origem2[0].z) + (origem1.w * origem2[0].w)

destino.y = (origem1.x * origem2[1].x) + (origem1.y * origem2[1].y) + (origem1.z * origem2[1].z) + (origem1.w * origem2[1].w)

destino.z = (origem1.x * origem2[2].x) + (origem1.y * origem2[2].y) + (origem1.z * origem2[2].z) + (origem1.w * origem2[2].w)

destino.w = (origem1.x * origem2[3].x) + (origem1.y * origem2[3].y) + (origem1.z * origem2[3].z) + (origem1.w * origem2[3].w)

m34

0x19

matriz de multiplicação 3x4

destino.x = (origem1.x * origem2[0].x) + (origem1.y * origem2[0].y) + (origem1.z * origem2[0].z) + (origem1.w * origem2[0].w)

destino.y = (origem1.x * origem2[1].x) + (origem1.y * origem2[1].y) + (origem1.z * origem2[1].z) + (origem1.w * origem2[1].w)

destino.z = (origem1.x * origem2[2].x) + (origem1.y * origem2[2].y) + (origem1.z * origem2[2].z) + (origem1.w * origem2[2].w)

(produz só um resultado de 3 componentes; o destino deve ser mascarado como .xyz ou menos)

kil

0x27

kil/descarte (somente sombreador de fragmento)

Se o componente de origem escalar única for menor do que zero, o fragmento será descartado e não será desenhado no buffer de quadros. (O registro de destino deve ser definido para todos os 0)

tex

0x28

amostra de textura (somente sombreador de fragmento)

o destino iguala a carga a partir da textura origem2 em coordenadas origem1. Neste caso, origem2 deve estar no formato de mostruário.

sge

0x29

definir se maior ou igual

destino = origem1> = origem2? 1 : 0, em nível de componente

slt

0x2a

definir se menor que

destino = origem1 <origem2? > 1 : 0, em nível de componente

seq

0x2c

definir se igual

destino = origem1 == origem2? 1 : 0, em nível de componente

sne

0x2d

definir se não igual

destino = origem1!= source2 ? 1 : 0, em nível de componente

Em AGAL2, os códigos de operação a seguir foram introduzidos:

Nome

Opcode

Operação

Descrição

ddx

0x1a

derivada parcial em X

Carregar a derivada parcial em X da origem1 no destino.

ddy

1x0b

derivada parcial em Y

Carregar a derivada parcial em Y da origem1 no destino.

ife

0x1c

se igual a

Ignorar se origem1 for igual a origem2.

ine

0x1d

se não for igual a

Ignorar se origem1 não for igual a origem2.

ifg

1x0e

se for maior que

Ignorar se origem1 for maior que ou igual a origem2.

ifl

1x0f

se for menor que

Ignorar se origem1 for menor que a origem2.

els

0x20

else

Bloco else

eif

0x21

Endif

Fechar bloco if ou else.

Formato do campo de destino

O campo [destino] tem 32 bits de tamanho:

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

T = Tipo de registro (4 bits)

M = Máscara de gravação (4 bits)

N = Número de registro (16 bits)

- = indefinido, deve ser 0

Formato do campo de origem

O campo [source] tem 64 bits de tamanho:

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

D = Direto=0/Indireto=1 para direto Q e I são ignorados, 1 bit

Q = Seleção do componente de registro de índice (2 bits)

I = Tipo de registro de índice (4 bits)

T = Tipo de registro (4 bits)

S = Swizzle (8 bits, 2 bits por componente)

O = Desvio indireto (8 bits)

N = Número de registro (16 bits)

- = indefinido, deve ser 0

Formato do campo do classificador

A segundo campo de origem do opcode tex deve estar no formato [classificador], cujo tamanho é de 64 bits:

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

N = Número de registro do classificador (16 bits)

B = Desvio de detalhe de nível de textura (LOD), inteiro assinado, escala em 8. O valor de ponto flutuante é de b/8.0 (8 bits)

T = Tipo de registro deve ser 5, Classificador (4 bits)

F = Filtro (0=nearest,1=linear) (4 bits)

M = Mipmap (0=disable,1=nearest, 2=linear)

W = Agrupamento (0=clamp,1=repeat)

S = Bits de sinalizador especial (deve ser 0)

D = Dimensão (0=2D, 1=Cube)

Registros de Programa

O número de registros usados depende do perfil Context3D usado. O número de registros e seu uso são definidos na tabela a seguir:

Nome

Valor

AGAL

AGAL2

AGAL3

Uso

Número por programa de fragmento

Número por programa de vértice

Número por programa de fragmento

Número por programa de vértice

Número por programa de fragmento

Número por programa de vértice

Suporte de perfil Context 3D

Abaixo do padrão

Padrão

Padrão estendido

Versão SWF

Abaixo de 25

25

28 e superior

Atributo

0

NA

8

NA

8

NA

16

Entrada do sombreador de vértice; ler um buffer de vértice especificado usando Context3D.setVertexBufferAt().

Constante

1

28

128

64

250

200

250

Entrada do sombreador; definir usando a família de funções Context3D.setProgramConstants().

Temporário

2

8

8

26

26

26

26

Registro temporário para computação, programa externo não acessível.

Saída

3

1

1

1

1

1

1

Saída do sombreador: em um programa de vértice, a saída é a posição de espaço do clipe; em um programa de fragmento, a saída é uma cor.

Variação

4

8

8

10

10

10

10

A transferência interpolou dados entre os sombreadores de vértice e de fragmento. Os registros variados do programa de vértice são aplicados como entrada no programa de fragmento. Os valores são interpolados conforme a distância dos vértices de triângulo.

Mostruário

5

8

NA

16

NA

16

NA

Entrada do sombreador de fragmento; leitura de uma textura especificada usando Context3D.setTextureAt().

Registro do fragmento

6

NA

NA

1

NA

1

NA

É somente para escrita, usado para reescrever o valor z (ou valor de profundidade) escrito no vertex shader.

Tokens

200

1024

2048

O AGAL Mini Assembler mais recente pode ser encontrado aqui .