AGSL (Android Graphics Shading Language)

Android Graphics Shading Language (AGSL) viene utilizzato da Android 13 e versioni successive per definire il comportamento degli oggetti RuntimeShader programmabili. AGSL condivide gran parte della sua sintassi con gli ombreggiatori dei frammenti GLSL, ma funziona all'interno del sistema di rendering della grafica Android per personalizzare la pittura all'interno di Canvas e filtrare i contenuti View.

Teoria del funzionamento

Gli effetti AGSL fanno parte della più ampia pipeline grafica di Android. Quando Android emette un'operazione di disegno con accelerazione GPU, assembla un singolo Shader di frammenti GPU per svolgere il lavoro richiesto. Questo ombreggiatore include in genere diversi pezzi. Ad esempio:

  • Valutare se un pixel cade all'interno o all'esterno della forma disegnata (o sul bordo, dove potrebbe essere applicato l'anti-aliasing).
  • Valutare se un pixel rientra o meno all'interno o all'esterno dell'area di ritaglio (di nuovo, con logica di anti-aliasing possibile per i pixel del bordo).
  • Logica per Shader sul Paint. Shader può essere in realtà un albero di oggetti (a causa di ComposeShader e di altre funzionalità descritte di seguito).
  • Logica simile per ColorFilter.
  • Codice di combinazione (per alcuni tipi di BlendMode).
  • Codice di conversione dello spazio colore, nell'ambito della gestione dei colori di Android.
  • Quando Paint ha un complesso albero di oggetti nei campi Shader, ColorFilter o BlendMode, c'è ancora un solo Shader frammento GPU. Ogni nodo nell'albero crea una singola funzione. Il codice di ritaglio e il codice geometrico creano ciascuno una funzione. Il codice di combinazione potrebbe creare una funzione. A questo punto, lo Shader dei frammenti chiama tutte queste funzioni (che potrebbero chiamare altre funzioni, ad esempio nel caso di un albero di Shader).

L'effetto AGSL contribuisce a una funzione (o più funzioni) al fragment Shader della GPU.

Sintassi di base

AGSL (e GLSL) sono lingue specifiche per i domini in stile C. Tipi come bool e int tracciano molto attentamente i loro equivalenti C; ce ne sono altri tipi per supportare vettori e matrici che supportano la funzionalità del dominio.

I qualificatori possono essere applicati ai tipi per ottenere suggerimenti di precisione, in modo univoco per le lingue di ombreggiatura. Le strutture di controllo come le istruzioni if-else funzionano in modo molto come in C; il linguaggio fornisce anche supporto per le istruzioni switch e i loop for con limitazioni. Alcune strutture di controllo richiedono espressioni costanti che possono essere valutate in fase di compilazione.

AGSL supporta le funzioni; ogni programma Shader inizia con la funzione main. Le funzioni definite dall'utente sono supportate, senza supporto per la ricorsione di qualsiasi tipo. Le funzioni utilizzano una convenzione per le chiamate "value-return". I valori trasferiti alle funzioni vengono copiati nei parametri quando la funzione viene chiamata e gli output vengono copiati. Ciò è determinato dai qualificatori in, out e inout.