Skip to content
This repository was archived by the owner on Feb 2, 2018. It is now read-only.

Compiler Interface

Erik Faye-Lund edited this page Jul 17, 2017 · 8 revisions

The shader-compiler is located in a separate shared object, /usr/lib/libcgdrv.so

parially understood:

struct CgCtx {
	/* 80 bytes large */
	unsigned int unknown00;
	const char *error;       /* error string */
	const char *log;         /* compile log */
	size_t        unknown12; /* size of... something! The driver mallocs a buffer of this size right on return. */
	void         *unknown16; /* pointer (0x248 bytes) */
	unsigned int  unknown20; /* small int (1) */
	void         *unknown24; /* pointer (0x220 bytes) */
	unsigned int  unknown28; /* size of unknown6 */
	void         *unknown32; /* pointer */
	unsigned int  unknown36; /* NULL / 0x0*/
	unsigned int  unknown40; /* huge value (0x40a273d0) */
	unsigned int *unknown44; /* poiner to unknown40 */
	unsigned int  unknown48; /* NULL / 0x0 */
	unsigned int  unknown52; /* NULL / 0x0 */
	void         *unknown56; /* pointer to 0x80 bytes buffer */
	unsigned int  unknown60; /* small int (3 -- this happes to be the fd of /dev/nvmap... coincidence?) */
	unsigned int  unknown64; /* small int (0x40) */
	unsigned int  unknown68; /* NULL / 0x0 */
	unsigned int  unknown72; /* small int (1) */
	unsigned int  unknown76; /* NULL / 0x0 */
}

void *CgDrv_Create(void)
int CgDrv_Compile(void *ctx, int unknown1, int shader_type, const char *str, size_t str_len, int unknown2)

unknown:

CgDrv_CleanUp
CgDrv_Delete

binary format:

struct AR20_binary {
	char signature[8] = {'A', 'R', '2', '0', '-', 'B', 'I', 'N'};
	uint32_t unknown08;
	uint32_t instruction_count; /* not sure about this */
	char binary[1];
}

offset  0: 'AR20-BIN'   - signature
offset  8: 01 00 00 00  - unknown
offset 12: 01 00 00 00  - instruction count?
offset 16: program (?)

example "gl_FragColor = vec4(1.0, 0.0, 1.0, 0.5)":

00072754 41 52 32 30 2D 42 49 4E 01 00 00 00 01 00 00 00        |AR20-BIN........|
00072764 01 00 41 25 00 00 00 00 01 00 00 15 00 00 00 00        |..A%............|
00072774 01 00 01 26 00 00 00 00 01 00 01 27 00 00 00 00        |...&.......'....|
00072784 01 00 01 28 01 00 00 00 08 00 04 28 E8 27 01 00        |...(.......(.'..|
00072794 00 F2 41 3F C8 47 01 00 00 F2 41 3F E8 A7 01 00        |..A?.G....A?....|
000727A4 00 F2 41 3F 08 C8 01 00 00 F2 41 3F 01 00 06 28        |..A?......A?...(|
000727B4 00 00 00 00 01 00 01 29 05 80 02 00                    |.......)........|

example "gl_FragColor = vec4(0.0, 1.0, 1.0, 0.5)":

00072404 41 52 32 30 2D 42 49 4E 01 00 00 00 01 00 00 00        |AR20-BIN........|
00072414 01 00 41 25 00 00 00 00 01 00 00 15 00 00 00 00        |..A%............|
00072424 01 00 01 26 00 00 00 00 01 00 01 27 00 00 00 00        |...&.......'....|
00072434 01 00 01 28 01 00 00 00 08 00 04 28 C8 27 01 00        |...(.......(.'..|
00072444 00 F2 41 3F E8 47 01 00 00 F2 41 3F E8 A7 01 00        |..A?.G....A?....|
00072454 00 F2 41 3F 08 C8 01 00 00 F2 41 3F 01 00 06 28        |..A?......A?...(|
00072464 00 00 00 00 01 00 01 29 05 80 02 00                    |.......)........|

example2 "gl_FragColor = vec4(gl_FragCoord.xy, 1.0, 0.5)":

000774DC 41 52 32 30 2D 42 49 4E 01 00 00 00 01 00 00 00        |AR20-BIN........|
000774EC 01 00 41 25 00 00 00 00 01 00 00 15 00 00 00 00        |..A%............|
000774FC 01 00 01 26 00 00 00 00 01 00 01 27 00 00 00 00        |...&.......'....|
0007750C 01 00 01 28 01 00 00 00 08 00 04 28 00 32 01 00        |...(.......(.2..|
0007751C 00 10 42 3F 40 52 01 00 00 00 42 45 E8 A7 01 00        |..B?@R....BE....|
0007752C 00 F2 41 3F 88 C8 01 00 00 F2 41 3F 01 00 06 28        |..A?......A?...(|
0007753C 00 00 00 00 01 00 01 29 05 80 02 00                    |.......)........|

example3 "gl_FragColor = vec4(gl_FragCoord.xy * gl_FragCoord.xy, 1.0, 0.5)":

0007514C 41 52 32 30 2D 42 49 4E 02 00 00 00 02 00 00 00        |AR20-BIN........|
0007515C 02 00 41 25 00 00 00 00 00 00 00 00 01 00 00 15        |..A%............|
0007516C 00 00 00 00 02 00 01 26 00 00 00 00 00 00 00 00        |.......&........|
0007517C 02 00 01 27 00 00 00 00 00 00 00 00 02 00 01 28        |...'...........(|
0007518C 01 00 00 00 05 00 00 00 10 00 04 28 00 72 01 00        |...........(.r..|
0007519C 00 10 42 3F 40 F2 01 00 00 00 42 46 00 72 03 00        |..B?@.....BF.r..|
000751AC 00 20 02 42 E8 A7 03 00 00 F2 41 3F 00 32 03 00        |. .B......A?.2..|
000751BC 00 A0 01 30 08 C7 03 00 00 F2 41 3F 40 46 03 00        |...0......A?@F..|
000751CC 00 F2 01 32 00 08 00 00 00 00 00 00 02 00 06 28        |...2...........(|
000751DC 00 00 00 00 00 00 00 00 02 00 01 29 00 00 00 00        |...........)....|
000751EC 05 80 02 00                                            |................|

example4 "gl_FragColor = vec4(gl_FragCoord.xy + gl_FragCoord.xy, 1.0, 0.5)"

0007515C 41 52 32 30 2D 42 49 4E 02 00 00 00 02 00 00 00        |AR20-BIN........|
0007516C 02 00 41 25 00 00 00 00 00 00 00 00 01 00 00 15        |..A%............|
0007517C 00 00 00 00 02 00 01 26 00 00 00 00 00 00 00 00        |.......&........|
0007518C 02 00 01 27 00 00 00 00 00 00 00 00 02 00 01 28        |...'...........(|
0007519C 01 00 00 00 05 00 00 00 10 00 04 28 00 72 01 00        |...........(.r..|
000751AC 00 10 42 3F 40 F2 01 00 00 00 42 45 E8 A7 03 00        |..B?@.....BE....|
000751BC 00 F2 41 3F 88 C8 03 00 00 F2 41 3F 00 26 03 00        |..A?......A?.&..|
000751CC 00 F2 49 3F 40 46 03 00 00 F2 49 3F E8 E7 0F 00        |..I?@F....I?....|
000751DC 00 F2 41 3E E8 E7 0F 00 00 F2 41 3E 02 00 06 28        |..A>......A>...(|
000751EC 00 00 00 00 00 00 00 00 02 00 01 29 00 00 00 00        |...........)....|
000751FC 05 80 02 00                                            |................|

example5 "gl_FragColor = vec4(gl_FragCoord.xy + gl_FragCoord.xy, gl_FragCoord.xy * gl_FragCoord.xy)"

000779C0 41 52 32 30 2D 42 49 4E 02 00 00 00 02 00 00 00        |AR20-BIN........|
000779D0 02 00 41 25 00 00 00 00 00 00 00 00 01 00 00 15        |..A%............|
000779E0 00 00 00 00 02 00 01 26 00 00 00 00 00 00 00 00        |.......&........|
000779F0 02 00 01 27 00 00 00 00 00 00 00 00 02 00 01 28        |...'...........(|
00077A00 01 00 00 00 05 00 00 00 10 00 04 28 00 72 01 00        |...........(.r..|
00077A10 00 C0 41 3F 40 F2 03 00 00 00 42 42 00 F2 01 00        |..A?@.....BB....|
00077A20 00 D0 01 38 00 00 D8 00 20 07 00 00 00 B2 01 00        |...8.... .......|
00077A30 00 A0 01 30 00 26 01 00 00 F2 49 3F 40 46 01 00        |...0.&....I?@F..|
00077A40 00 F2 49 3F 40 C6 01 00 00 F2 01 32 02 00 06 28        |..I?@......2...(|
00077A50 00 00 00 00 00 00 00 00 02 00 01 29 05 80 02 00        |...........)....|
00077A60 00 00 00 00                                            |................|

example6 "gl_FragColor = vec4(cos(gl_FragCoord.xy), 1.0, 0.5)":

00072E0C 41 52 32 30 2D 42 49 4E 01 00 00 00 05 00 00 00        |AR20-BIN........|
00072E1C 05 00 41 25 00 00 00 00 00 00 00 00 00 00 00 00        |..A%............|
00072E2C 00 00 00 00 00 00 00 00 01 00 00 15 00 00 00 00        |................|
00072E3C 05 00 01 26 00 00 00 00 01 00 00 00 05 00 00 00        |...&............|
00072E4C 09 00 00 00 0D 00 00 00 08 00 04 26 00 00 C0 0E        |...........&....|
00072E5C 00 00 00 00 00 00 C0 0A 00 00 00 00 00 00 C0 0D        |................|
00072E6C 00 00 00 00 00 00 C0 09 00 00 00 00 05 00 01 27        |...............'|
00072E7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00        |................|
00072E8C 00 00 00 00 05 00 01 28 01 00 00 00 00 00 00 00        |.......(........|
00072E9C 00 00 00 00 05 00 00 00 09 00 00 00 18 00 04 28        |...............(|
00072EAC 40 F2 01 00 00 00 42 45 00 72 01 00 00 10 42 3F        |@.....BE.r....B?|
00072EBC E8 A7 00 00 00 F2 41 3F 88 C8 00 00 00 F2 41 3F        |......A?......A?|
00072ECC C0 40 00 00 00 F2 41 3F E8 E7 0F 00 00 F2 41 3E        |.@....A?......A>|
00072EDC E8 E7 0F 00 00 F2 41 3E E8 E7 0F 00 00 F2 41 3E        |......A>......A>|
00072EEC 80 20 00 00 00 F2 41 3F E8 E7 0F 00 00 F2 41 3E        |. ....A?......A>|
00072EFC E8 E7 0F 00 00 F2 41 3E E8 E7 0F 00 00 F2 41 3E        |......A>......A>|
00072F0C 05 00 06 28 00 00 00 00 00 00 00 00 00 00 00 00        |...(............|
00072F1C 00 00 00 00 00 00 00 00 05 00 01 29 00 00 00 00        |...........)....|
00072F2C 00 00 00 00 00 00 00 00 00 00 00 00 05 00 02 00        |................|

There's some pragmas to enable blending etc: #pragma profilepragma blendoperation( gl_FragColor, GL_FUNC_ADD, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD, GL_ONE, GL_ONE), #pragma profilepragma depthmask(false), #pragma profilepragma stencilmask(false) and #pragma profilepragma coveragemask(dont_care)

Clone this wiki locally