0x12300000: 0x69040000: 3DSTATE_PIPELINE_SELECT 0x12300004: 0x79090000: 3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP 0x12300008: 0x00000000: dword 1 0x1230000c: 0x61020000: STATE_SIP 0x12300010: 0x00000000: dword 1 0x12300014: 0x680b0000: 3DSTATE_VF_STATISTICS 0x12300018: 0x61010004: STATE_BASE_ADDRESS 0x1230001c: 0x00000001: general state base address 0x00000000 0x12300020: 0x00000001: surface state base address 0x00000000 0x12300024: 0x00000001: indirect state base address 0x00000000 0x12300028: 0x00000001: general state upper bound disabled 0x1230002c: 0x00000001: indirect state upper bound disabled 0x12300030: 0x78010004: 3DSTATE_BINDING_TABLE_POINTERS 0x12300034: 0x00007e20: VS binding table 0x12300038: 0x00000000: GS binding table 0x1230003c: 0x00000000: Clip binding table 0x12300040: 0x00000000: SF binding table 0x12300044: 0x00007e20: WM binding table 0x12300048: 0x79010003: 3DSTATE_CONSTANT_COLOR 0x1230004c: 0x00000000: dword 1 0x12300050: 0x00000000: dword 2 0x12300054: 0x00000000: dword 3 0x12300058: 0x00000000: dword 4 0x1230005c: 0x79050004: 3DSTATE_DEPTH_BUFFER 0x12300060: 0x2c0805ff: 2D, z24s8, pitch = 1536 bytes, tiled 0x12300064: 0x00000000: depth offset 0x12300068: 0x09584ac0: 300x300 0x1230006c: 0x00000000: volume depth 0x12300070: 0x00000000: 0x12300074: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300078: 0x00007d60: VS state 0x1230007c: 0x00000000: GS state 0x12300080: 0x00007d21: Clip state 0x12300084: 0x00007d80: SF state 0x12300088: 0x00007de0: WM state 0x1230008c: 0x00007fc0: CC state 0x12300090: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300094: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300098: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230009c: 0x60010000: CS_URB_STATE 0x123000a0: 0x00000024: entry_size: 2 [192 bytes], n_entries: 4 0x123000a4: 0x79000002: 3DSTATE_DRAWING_RECTANGLE 0x123000a8: 0x00000000: top left: 0,0 0x123000ac: 0x012b012b: bottom right: 299,299 0x123000b0: 0x00000000: origin: 0,0 0x123000b4: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x123000b8: 0x0000000c: buffer 0: sequential, pitch 12b 0x123000bc: 0x00000000: buffer address 0x123000c0: 0x00000000: max index 0x123000c4: 0x00000000: mbz 0x123000c8: 0x78090001: 3DSTATE_VERTEX_ELEMENTS 0x123000cc: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x123000d0: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x123000d4: 0x60020100: CONSTANT_BUFFER: valid 0x123000d8: 0x00000001: offset: 0x00000000, length: 128 bytes 0x123000dc: 0x7b001804: 3DPRIMITIVE: tri fan sequential 0x123000e0: 0x00000004: vertex count 0x123000e4: 0x00000000: start vertex 0x123000e8: 0x00000001: instance count 0x123000ec: 0x00000000: start instance 0x123000f0: 0x00000000: index bias 0x123000f4: 0x78010004: 3DSTATE_BINDING_TABLE_POINTERS 0x123000f8: 0x00007b40: VS binding table 0x123000fc: 0x00000000: GS binding table 0x12300100: 0x00000000: Clip binding table 0x12300104: 0x00000000: SF binding table 0x12300108: 0x00007b40: WM binding table 0x1230010c: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300110: 0x00007aa0: VS state 0x12300114: 0x00007a41: GS state 0x12300118: 0x00007a61: Clip state 0x1230011c: 0x00007ac0: SF state 0x12300120: 0x00007b00: WM state 0x12300124: 0x00007cc0: CC state 0x12300128: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x1230012c: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300130: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300134: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x12300138: 0x0000000c: buffer 0: sequential, pitch 12b 0x1230013c: 0x00000000: buffer address 0x12300140: 0x00000000: max index 0x12300144: 0x00000000: mbz 0x12300148: 0x60020100: CONSTANT_BUFFER: valid 0x1230014c: 0x00000082: offset: 0x00000080, length: 192 bytes 0x12300150: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300154: 0x00000052: vertex count 0x12300158: 0x00000000: start vertex 0x1230015c: 0x00000001: instance count 0x12300160: 0x00000000: start instance 0x12300164: 0x00000000: index bias 0x12300168: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x1230016c: 0x00007aa0: VS state 0x12300170: 0x00007a21: GS state 0x12300174: 0x00007a61: Clip state 0x12300178: 0x00007ac0: SF state 0x1230017c: 0x00007b00: WM state 0x12300180: 0x00007cc0: CC state 0x12300184: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300188: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x1230018c: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300190: 0x60020100: CONSTANT_BUFFER: valid 0x12300194: 0x00000082: offset: 0x00000080, length: 192 bytes 0x12300198: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x1230019c: 0x00000050: vertex count 0x123001a0: 0x00000052: start vertex 0x123001a4: 0x00000001: instance count 0x123001a8: 0x00000000: start instance 0x123001ac: 0x00000000: index bias 0x123001b0: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123001b4: 0x00007aa0: VS state 0x123001b8: 0x00007a01: GS state 0x123001bc: 0x00007a61: Clip state 0x123001c0: 0x00007ac0: SF state 0x123001c4: 0x00007b00: WM state 0x123001c8: 0x00007cc0: CC state 0x123001cc: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x123001d0: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x123001d4: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x123001d8: 0x60020100: CONSTANT_BUFFER: valid 0x123001dc: 0x00000142: offset: 0x00000140, length: 192 bytes 0x123001e0: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x123001e4: 0x00000052: vertex count 0x123001e8: 0x000000a2: start vertex 0x123001ec: 0x00000001: instance count 0x123001f0: 0x00000000: start instance 0x123001f4: 0x00000000: index bias 0x123001f8: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123001fc: 0x00007aa0: VS state 0x12300200: 0x000079e1: GS state 0x12300204: 0x00007a61: Clip state 0x12300208: 0x00007ac0: SF state 0x1230020c: 0x00007b00: WM state 0x12300210: 0x00007cc0: CC state 0x12300214: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300218: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x1230021c: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300220: 0x60020100: CONSTANT_BUFFER: valid 0x12300224: 0x00000142: offset: 0x00000140, length: 192 bytes 0x12300228: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x1230022c: 0x00000050: vertex count 0x12300230: 0x000000f4: start vertex 0x12300234: 0x00000001: instance count 0x12300238: 0x00000000: start instance 0x1230023c: 0x00000000: index bias 0x12300240: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300244: 0x00007aa0: VS state 0x12300248: 0x000079c1: GS state 0x1230024c: 0x00007a61: Clip state 0x12300250: 0x00007ac0: SF state 0x12300254: 0x00007b00: WM state 0x12300258: 0x00007cc0: CC state 0x1230025c: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300260: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300264: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300268: 0x60020100: CONSTANT_BUFFER: valid 0x1230026c: 0x00000142: offset: 0x00000140, length: 192 bytes 0x12300270: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300274: 0x000079a0: VS state 0x12300278: 0x000079c1: GS state 0x1230027c: 0x00007a61: Clip state 0x12300280: 0x00007ac0: SF state 0x12300284: 0x00007b00: WM state 0x12300288: 0x00007cc0: CC state 0x1230028c: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300290: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300294: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300298: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x1230029c: 0x00000018: buffer 0: sequential, pitch 24b 0x123002a0: 0x00000f48: buffer address 0x123002a4: 0x00000000: max index 0x123002a8: 0x00000000: mbz 0x123002ac: 0x78090003: 3DSTATE_VERTEX_ELEMENTS 0x123002b0: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x123002b4: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x123002b8: 0x0440000c: buffer 0: valid, type 0x0040, src offset 0x000c bytes 0x123002bc: 0x11130004: (X, Y, Z, 1.0), dst offset 0x10 bytes 0x123002c0: 0x60020100: CONSTANT_BUFFER: valid 0x123002c4: 0x00000202: offset: 0x00000200, length: 192 bytes 0x123002c8: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x123002cc: 0x000000a2: vertex count 0x123002d0: 0x00000000: start vertex 0x123002d4: 0x00000001: instance count 0x123002d8: 0x00000000: start instance 0x123002dc: 0x00000000: index bias 0x123002e0: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123002e4: 0x000079a0: VS state 0x123002e8: 0x00000000: GS state 0x123002ec: 0x00007901: Clip state 0x123002f0: 0x00007940: SF state 0x123002f4: 0x00007960: WM state 0x123002f8: 0x00007cc0: CC state 0x123002fc: 0x00000000: MI_NOOP 0x12300300: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300304: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300308: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230030c: 0x60020100: CONSTANT_BUFFER: valid 0x12300310: 0x00000202: offset: 0x00000200, length: 192 bytes 0x12300314: 0x7b001404: 3DPRIMITIVE: tri strip sequential 0x12300318: 0x0000002a: vertex count 0x1230031c: 0x000000a2: start vertex 0x12300320: 0x00000001: instance count 0x12300324: 0x00000000: start instance 0x12300328: 0x00000000: index bias 0x1230032c: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300330: 0x00007860: VS state 0x12300334: 0x00007801: GS state 0x12300338: 0x00007821: Clip state 0x1230033c: 0x00007880: SF state 0x12300340: 0x000078a0: WM state 0x12300344: 0x00007cc0: CC state 0x12300348: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x1230034c: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300350: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300354: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x12300358: 0x0000000c: buffer 0: sequential, pitch 12b 0x1230035c: 0x00002268: buffer address 0x12300360: 0x00000000: max index 0x12300364: 0x00000000: mbz 0x12300368: 0x78090001: 3DSTATE_VERTEX_ELEMENTS 0x1230036c: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x12300370: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x12300374: 0x60020100: CONSTANT_BUFFER: valid 0x12300378: 0x000002c2: offset: 0x000002c0, length: 192 bytes 0x1230037c: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300380: 0x0000002a: vertex count 0x12300384: 0x00000000: start vertex 0x12300388: 0x00000001: instance count 0x1230038c: 0x00000000: start instance 0x12300390: 0x00000000: index bias 0x12300394: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300398: 0x00007860: VS state 0x1230039c: 0x000077e1: GS state 0x123003a0: 0x00007821: Clip state 0x123003a4: 0x00007880: SF state 0x123003a8: 0x000078a0: WM state 0x123003ac: 0x00007cc0: CC state 0x123003b0: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x123003b4: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x123003b8: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x123003bc: 0x60020100: CONSTANT_BUFFER: valid 0x123003c0: 0x000002c2: offset: 0x000002c0, length: 192 bytes 0x123003c4: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x123003c8: 0x00000028: vertex count 0x123003cc: 0x0000002a: start vertex 0x123003d0: 0x00000001: instance count 0x123003d4: 0x00000000: start instance 0x123003d8: 0x00000000: index bias 0x123003dc: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123003e0: 0x00007860: VS state 0x123003e4: 0x000077c1: GS state 0x123003e8: 0x00007821: Clip state 0x123003ec: 0x00007880: SF state 0x123003f0: 0x000078a0: WM state 0x123003f4: 0x00007cc0: CC state 0x123003f8: 0x00000000: MI_NOOP 0x123003fc: 0x00000000: MI_NOOP 0x12300400: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300404: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300408: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230040c: 0x60020100: CONSTANT_BUFFER: valid 0x12300410: 0x00000382: offset: 0x00000380, length: 192 bytes 0x12300414: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300418: 0x0000002a: vertex count 0x1230041c: 0x00000052: start vertex 0x12300420: 0x00000001: instance count 0x12300424: 0x00000000: start instance 0x12300428: 0x00000000: index bias 0x1230042c: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300430: 0x00007860: VS state 0x12300434: 0x000077a1: GS state 0x12300438: 0x00007821: Clip state 0x1230043c: 0x00007880: SF state 0x12300440: 0x000078a0: WM state 0x12300444: 0x00007cc0: CC state 0x12300448: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x1230044c: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300450: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x12300454: 0x60020100: CONSTANT_BUFFER: valid 0x12300458: 0x00000382: offset: 0x00000380, length: 192 bytes 0x1230045c: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x12300460: 0x00000028: vertex count 0x12300464: 0x0000007c: start vertex 0x12300468: 0x00000001: instance count 0x1230046c: 0x00000000: start instance 0x12300470: 0x00000000: index bias 0x12300474: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300478: 0x00007860: VS state 0x1230047c: 0x00007781: GS state 0x12300480: 0x00007821: Clip state 0x12300484: 0x00007880: SF state 0x12300488: 0x000078a0: WM state 0x1230048c: 0x00007cc0: CC state 0x12300490: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300494: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300498: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230049c: 0x60020100: CONSTANT_BUFFER: valid 0x123004a0: 0x00000382: offset: 0x00000380, length: 192 bytes 0x123004a4: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123004a8: 0x00007760: VS state 0x123004ac: 0x00007781: GS state 0x123004b0: 0x00007821: Clip state 0x123004b4: 0x00007880: SF state 0x123004b8: 0x000078a0: WM state 0x123004bc: 0x00007cc0: CC state 0x123004c0: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x123004c4: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x123004c8: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x123004cc: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x123004d0: 0x00000018: buffer 0: sequential, pitch 24b 0x123004d4: 0x00002a30: buffer address 0x123004d8: 0x00000000: max index 0x123004dc: 0x00000000: mbz 0x123004e0: 0x78090003: 3DSTATE_VERTEX_ELEMENTS 0x123004e4: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x123004e8: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x123004ec: 0x0440000c: buffer 0: valid, type 0x0040, src offset 0x000c bytes 0x123004f0: 0x11130004: (X, Y, Z, 1.0), dst offset 0x10 bytes 0x123004f4: 0x60020100: CONSTANT_BUFFER: valid 0x123004f8: 0x00000442: offset: 0x00000440, length: 192 bytes 0x123004fc: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300500: 0x00000052: vertex count 0x12300504: 0x00000000: start vertex 0x12300508: 0x00000001: instance count 0x1230050c: 0x00000000: start instance 0x12300510: 0x00000000: index bias 0x12300514: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300518: 0x00007760: VS state 0x1230051c: 0x00000000: GS state 0x12300520: 0x000076c1: Clip state 0x12300524: 0x00007700: SF state 0x12300528: 0x00007720: WM state 0x1230052c: 0x00007cc0: CC state 0x12300530: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300534: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300538: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230053c: 0x60020100: CONSTANT_BUFFER: valid 0x12300540: 0x00000442: offset: 0x00000440, length: 192 bytes 0x12300544: 0x7b001404: 3DPRIMITIVE: tri strip sequential 0x12300548: 0x00000016: vertex count 0x1230054c: 0x00000052: start vertex 0x12300550: 0x00000001: instance count 0x12300554: 0x00000000: start instance 0x12300558: 0x00000000: index bias 0x1230055c: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300560: 0x00007620: VS state 0x12300564: 0x000075c1: GS state 0x12300568: 0x000075e1: Clip state 0x1230056c: 0x00007640: SF state 0x12300570: 0x00007660: WM state 0x12300574: 0x00007cc0: CC state 0x12300578: 0x00000000: MI_NOOP 0x1230057c: 0x00000000: MI_NOOP 0x12300580: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300584: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300588: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230058c: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x12300590: 0x0000000c: buffer 0: sequential, pitch 12b 0x12300594: 0x000033f0: buffer address 0x12300598: 0x00000000: max index 0x1230059c: 0x00000000: mbz 0x123005a0: 0x78090001: 3DSTATE_VERTEX_ELEMENTS 0x123005a4: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x123005a8: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x123005ac: 0x60020100: CONSTANT_BUFFER: valid 0x123005b0: 0x00000502: offset: 0x00000500, length: 192 bytes 0x123005b4: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x123005b8: 0x0000002a: vertex count 0x123005bc: 0x00000000: start vertex 0x123005c0: 0x00000001: instance count 0x123005c4: 0x00000000: start instance 0x123005c8: 0x00000000: index bias 0x123005cc: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123005d0: 0x00007620: VS state 0x123005d4: 0x000075a1: GS state 0x123005d8: 0x000075e1: Clip state 0x123005dc: 0x00007640: SF state 0x123005e0: 0x00007660: WM state 0x123005e4: 0x00007cc0: CC state 0x123005e8: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x123005ec: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x123005f0: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x123005f4: 0x60020100: CONSTANT_BUFFER: valid 0x123005f8: 0x00000502: offset: 0x00000500, length: 192 bytes 0x123005fc: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x12300600: 0x00000028: vertex count 0x12300604: 0x0000002a: start vertex 0x12300608: 0x00000001: instance count 0x1230060c: 0x00000000: start instance 0x12300610: 0x00000000: index bias 0x12300614: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300618: 0x00007620: VS state 0x1230061c: 0x00007581: GS state 0x12300620: 0x000075e1: Clip state 0x12300624: 0x00007640: SF state 0x12300628: 0x00007660: WM state 0x1230062c: 0x00007cc0: CC state 0x12300630: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300634: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300638: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230063c: 0x60020100: CONSTANT_BUFFER: valid 0x12300640: 0x000005c2: offset: 0x000005c0, length: 192 bytes 0x12300644: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300648: 0x0000002a: vertex count 0x1230064c: 0x00000052: start vertex 0x12300650: 0x00000001: instance count 0x12300654: 0x00000000: start instance 0x12300658: 0x00000000: index bias 0x1230065c: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300660: 0x00007620: VS state 0x12300664: 0x00007561: GS state 0x12300668: 0x000075e1: Clip state 0x1230066c: 0x00007640: SF state 0x12300670: 0x00007660: WM state 0x12300674: 0x00007cc0: CC state 0x12300678: 0x00000000: MI_NOOP 0x1230067c: 0x00000000: MI_NOOP 0x12300680: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300684: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300688: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230068c: 0x60020100: CONSTANT_BUFFER: valid 0x12300690: 0x000005c2: offset: 0x000005c0, length: 192 bytes 0x12300694: 0x7b001c04: 3DPRIMITIVE: quad list sequential 0x12300698: 0x00000028: vertex count 0x1230069c: 0x0000007c: start vertex 0x123006a0: 0x00000001: instance count 0x123006a4: 0x00000000: start instance 0x123006a8: 0x00000000: index bias 0x123006ac: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123006b0: 0x00007620: VS state 0x123006b4: 0x00007541: GS state 0x123006b8: 0x000075e1: Clip state 0x123006bc: 0x00007640: SF state 0x123006c0: 0x00007660: WM state 0x123006c4: 0x00007cc0: CC state 0x123006c8: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x123006cc: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x123006d0: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x123006d4: 0x60020100: CONSTANT_BUFFER: valid 0x123006d8: 0x000005c2: offset: 0x000005c0, length: 192 bytes 0x123006dc: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x123006e0: 0x00007520: VS state 0x123006e4: 0x00007541: GS state 0x123006e8: 0x000075e1: Clip state 0x123006ec: 0x00007640: SF state 0x123006f0: 0x00007660: WM state 0x123006f4: 0x00007cc0: CC state 0x123006f8: 0x00000000: MI_NOOP 0x123006fc: 0x00000000: MI_NOOP 0x12300700: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300704: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300708: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230070c: 0x78080003: 3DSTATE_VERTEX_BUFFERS 0x12300710: 0x00000018: buffer 0: sequential, pitch 24b 0x12300714: 0x00003bb8: buffer address 0x12300718: 0x00000000: max index 0x1230071c: 0x00000000: mbz 0x12300720: 0x78090003: 3DSTATE_VERTEX_ELEMENTS 0x12300724: 0x04400000: buffer 0: valid, type 0x0040, src offset 0x0000 bytes 0x12300728: 0x11130000: (X, Y, Z, 1.0), dst offset 0x00 bytes 0x1230072c: 0x0440000c: buffer 0: valid, type 0x0040, src offset 0x000c bytes 0x12300730: 0x11130004: (X, Y, Z, 1.0), dst offset 0x10 bytes 0x12300734: 0x60020100: CONSTANT_BUFFER: valid 0x12300738: 0x00000682: offset: 0x00000680, length: 192 bytes 0x1230073c: 0x7b002004: 3DPRIMITIVE: quad strip sequential 0x12300740: 0x00000052: vertex count 0x12300744: 0x00000000: start vertex 0x12300748: 0x00000001: instance count 0x1230074c: 0x00000000: start instance 0x12300750: 0x00000000: index bias 0x12300754: 0x78000005: 3DSTATE_PIPELINED_POINTERS 0x12300758: 0x00007520: VS state 0x1230075c: 0x00000000: GS state 0x12300760: 0x00007481: Clip state 0x12300764: 0x000074c0: SF state 0x12300768: 0x000074e0: WM state 0x1230076c: 0x00007cc0: CC state 0x12300770: 0x60003f01: URB_FENCE: cs vfe sf clip gs vs 0x12300774: 0x05212040: vs fence: 64, clip_fence: 82, gs_fence: 72 0x12300778: 0x18000062: sf fence: 98, vfe_fence: 0, cs_fence: 384 0x1230077c: 0x60020100: CONSTANT_BUFFER: valid 0x12300780: 0x00000682: offset: 0x00000680, length: 192 bytes 0x12300784: 0x7b001404: 3DPRIMITIVE: tri strip sequential 0x12300788: 0x00000016: vertex count 0x1230078c: 0x00000052: start vertex 0x12300790: 0x00000001: instance count 0x12300794: 0x00000000: start instance 0x12300798: 0x00000000: index bias 0x1230079c: 0x05000000: MI_BATCH_BUFFER_END #n670'>670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
#!/bin/sh

genimage='./gen-image'
mediactl='media-ctl'
yavta='yavta'
frames_dir=/tmp/

# ------------------------------------------------------------------------------
# Miscellaneous
#

vsp1_device() {
	$mediactl -d $mdev -p | grep 'bus info' | sed 's/.*platform://'
}

vsp1_model() {
	$mediactl -d $mdev -p | grep 'model' | sed 's/.* //'
}

vsp1_generation() {
	echo $(vsp1_model) | sed 's/-.*//'
}

vsp1_has_feature() {
	local feature=$1
	local entity_name=$(echo $feature | sed 's/\[.*//')

	($mediactl -d $mdev -p | grep -q -- "- entity.*$entity_name") || return

	local option=$(echo $feature | cut -d '[' -f 2 -s | cut -d ']' -f 1)

	[ -z $option ] && return

	local key=$(echo $option | sed 's/:.*//')
	local value=$(echo $option | sed "s/.*:'\(.*\)'/\1/")

	case $key in
	control)
		vsp1_has_control $entity_name "$value"
		return
		;;
	*)
		return 1
		;;
	esac
}

vsp1_count_rpfs() {
	$mediactl -d $mdev -p | grep -- '- entity.*rpf.[0-9] [^i]' | wc -l
}

vsp1_count_wpfs() {
	$mediactl -d $mdev -p | grep -- '- entity.*wpf.[0-9] [^o]' | wc -l
}

vsp1_count_bru_inputs() {
	local num_pads=`media-ctl -p | grep 'entity.*bru' | sed 's/.*(\([0-9]\) pads.*/\1/'`
	echo $((num_pads-1))
}

vsp1_entity_subdev() {
	$mediactl -d $mdev -e "$dev $1"
}

vsp1_entity_get_size() {
	local entity=$1
	local pad=$2

	$mediactl -d $mdev --get-v4l2 "'$dev $entity':$pad" | grep fmt | \
	      sed 's/.*\/\([0-9x]*\).*/\1/'
}

vsp1_has_control() {
	local subdev=$(vsp1_entity_subdev $1)
	local control_name=$(echo $2 | tr '+' ' ')

	$yavta --no-query -l $subdev | grep -q -- "$control_name"
}

vsp1_set_control() {
	local entity=$1
	local control_name=$(echo $2 | tr '+' ' ')
	local value=$3

	local subdev=$(vsp1_entity_subdev $entity)
	local control=$($yavta --no-query -l $subdev | grep -- "$control_name" | cut -d ' ' -f 2)

	echo "Setting control $control_name ($control) to $value" | ./logger.sh "$entity" >> $logfile
	$yavta --no-query -w "$control $value" $subdev | ./logger.sh "$entity" >> $logfile
}

# -----------------------------------------------------------------------------
# Referance frame generation
#

reference_frame() {
	local file=$1
	local in_format=$2
	local out_format=$3
	local size=$4
	shift 4

	local alpha=
	local options=

	# gen-image doesn't support processing HSV input images. The good news
	# is that the HSV tests that take HSV images as inputs don't need to
	# perform any processing. We can set the input format to RGB for HSB
	# reference frame generation.
	case $in_format in
	HSV24 | HSV32)
		in_format=ARGB32
		;;
	esac

	# Start with the input format to compute the alpha value being used by
	# the RPF after unpacking. Keep in sync with generate_input_frame.
	case $in_format in
	ARGB555)
		# The 1-bit alpha value is expanded to 8 bits by copying the
		# high order bits, resulting in value of 255 after unpacking.
		alpha=255
		;;
	ABGR32 | ARGB32)
		# 8-bit alpha value, hardcoded to 200.
		alpha=200
		;;
	*)
		# In all other cases the alpha value is set through a control
		# whose default value is 255.
		alpha=255
		;;
	esac

	# Convert the input alpha value based on the output format.
	case $out_format in
	ARGB555 | ABGR32 | ARGB32)
		# Pass the 8-bit alpha value unchanged to the image generator.
		;;
	XRGB555)
		# The format has the X bit hardcoded to 0.
		alpha=0
		;;
	*)
		# In all other cases the alpha value is set through a control
		# whose default value is 255.
		alpha=255
		;;
	esac

	local arg
	for arg in $* ; do
		local name=$(echo $arg | cut -d '=' -f 1)
		local value=$(echo $arg | cut -d '=' -f 2)

		case $name in
		clu)
			options="$options --clu $value"
			;;
		crop)
			options="$options --crop $value"
			;;
		hflip)
			[ x$value = x1 ] && options="$options --hflip"
			;;
		lut)
			options="$options --lut $value"
			;;
		rotate)
			[ x$value = x90 ] && {
				options="$options --rotate" ;
				__vsp_pixel_perfect=false ;
			}
			;;
		vflip)
			[ x$value = x1 ] && options="$options --vflip"
			;;
		esac
	done

	[ x$__vsp_bru_inputs != x ] && options="$options -c $__vsp_bru_inputs"

	$genimage -i $in_format -f $out_format -s $size -a $alpha $options -o $file \
		frames/frame-reference-1024x768.pnm
}

reference_histogram() {
	local file=$1
	local format=$2
	local size=$3

	$genimage -i $format -f $format -s $size -H $file \
		frames/frame-reference-1024x768.pnm
}

# ------------------------------------------------------------------------------
# Image and histogram comparison
#

#
# Compare the two frames for exact match.
#
compare_frame_exact() {
	local img_a=$3
	local img_b=$4

	local match='fail'
	diff -q $img_a $img_b > /dev/null && match='pass'

	echo "Compared $img_a and $img_b: $match" | ./logger.sh check >> $logfile

	if [ $match = 'pass' ] ; then
		return 0
	else
		return 1
	fi
}

#
# Compare the two frames using a fuzzy match algorithm to account for errors
# introduced by the YUV packing. Accept a maximum 1% mean average error over
# the whole frame with no more than 5% of the pixels differing.
#
compare_frame_fuzzy() {
	local fmt=$(echo $1 | sed 's/M$/P/')
	local size=$2
	local img_a=$3
	local img_b=$4

	local pnm_a=${img_a/bin/pnm}
	local pnm_b=${img_b/bin/pnm}

	raw2rgbpnm -f $fmt -s $size $img_a $pnm_a > /dev/null
	raw2rgbpnm -f $fmt -s $size $img_b $pnm_b > /dev/null

	local ae=$(compare -metric ae $pnm_a $pnm_b /dev/null 2>&1)
	local mae=$(compare -metric mae $pnm_a $pnm_b /dev/null 2>&1 | sed 's/.*(\(.*\))/\1/')

	rm $pnm_a
	rm $pnm_b

	local width=$(echo $size | cut -d 'x' -f 1)
	local height=$(echo $size | cut -d 'x' -f 2)

	local ae_match=$(echo $ae $width $height | awk '{ if ($1 / $2 / $3 < 0.05) { print "pass" } else { print "fail" } }')
	local mae_match=$(echo $mae | awk '{ if ($1 < 0.01) { print "pass" } else { print "fail" } }')

	echo "Compared $img_a and $img_b: ae $ae ($ae_match) mae $mae ($mae_match)" | ./logger.sh check >> $logfile

	if [ $ae_match = 'pass' -a $mae_match = 'pass' ] ; then
		return 0
	else
		return 1
	fi
}

compare_frames() {
	local args=$*
	local pipe=$__vsp_pipe
	local in_format=$__vsp_rpf_format
	local out_format=$__vsp_wpf_format
	local wpf=$__vsp_wpf_index

	local in_fmt=$(echo $in_format | tr '[:upper:]' '[:lower:]')
	local out_fmt=$(echo $out_format | tr '[:upper:]' '[:lower:]')
	local size=$(vsp1_entity_get_size wpf.$wpf 1)

	reference_frame ${frames_dir}ref-frame.bin $in_format $out_format $size $args

	local method=exact
	local result="pass"
	local params=${args// /-}
	params=${params:+-$params}
	params=${params//\//_}
	params=${params//=/_}
	params=${params//(/_}
	params=${params//)/_}
	params=$pipe-$in_fmt-$out_fmt-$size$params

	if [ x$__vsp_pixel_perfect != xtrue ] ; then
		method=fuzzy
	fi

	for frame in ${frames_dir}frame-*.bin ; do
		local match="true"

		(compare_frame_$method $out_format $size $frame ${frames_dir}ref-frame.bin) ||  {
			match="false" ;
			result="fail" ;
		}

		if [ $match = "false" -o x$VSP_KEEP_FRAMES = x1 ] ; then
			mv $frame ${0/.sh/}-$params-$(basename ${frame})
		fi
	done

	if [ x$VSP_KEEP_FRAMES = x1 -o $result = "fail" ] ; then
		mv ${frames_dir}ref-frame.bin ${0/.sh/}-$params-ref-frame.bin
	else
		rm -f ${frames_dir}ref-frame.bin
		rm -f ${frames_dir}frame-*.bin
	fi

	echo $result
}

compare_histogram() {
	local histo_a=$1
	local histo_b=$2

	local match='fail'
	diff -q $histo_a $histo_b > /dev/null && match='pass'

	echo "Compared $histo_a and $histo_b: $match" | ./logger.sh check >> $logfile

	if [ $match = 'pass' ] ; then
		return 0
	else
		return 1
	fi
}

compare_histograms() {
	local format=$__vsp_wpf_format
	local wpf=$__vsp_wpf_index

	local fmt=$(echo $format | tr '[:upper:]' '[:lower:]')
	local size=$(vsp1_entity_get_size wpf.$wpf 1)

	reference_histogram ${frames_dir}ref-histogram.bin $format $size

	local result="pass"
	for histo in ${frames_dir}histo-*.bin ; do
		(compare_histogram $histo ${frames_dir}ref-histogram.bin) || {
			mv $histo ${0/.sh/}-$(basename ${histo/.bin/-$fmt.bin}) ;
			result="fail"
		}
	done

	if [ $result = "fail" ] ; then
		mv ${frames_dir}ref-histogram.bin ${0/.sh/}-ref-histogram-$fmt.bin
	else
		rm -f ${frames_dir}ref-histogram.bin
		rm -f ${frames_dir}histo-*.bin
	fi

	echo $result
}

# ------------------------------------------------------------------------------
# Pipeline configuration
#

pipe_none() {
	# Nothing to be done
	return
}

pipe_rpf_bru() {
	local ninputs=$1

	local bru_output=$(vsp1_count_bru_inputs)

	for input in `seq 0 1 $((ninputs-1))` ; do
		$mediactl -d $mdev -l "'$dev rpf.$input':1 -> '$dev bru':$input [1]"
	done
	$mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"

	__vsp_bru_inputs=$ninputs
}

pipe_rpf_bru_uds() {
	local bru_output=$(vsp1_count_bru_inputs)

	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev bru':0 [1]"
	$mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev uds.0':0 [1]"
	$mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_clu() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev clu':0 [1]"
	$mediactl -d $mdev -l "'$dev clu':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_hgo() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hgo':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_hst() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hst':0 [1]"
	$mediactl -d $mdev -l "'$dev hst':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_lut() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev lut':0 [1]"
	$mediactl -d $mdev -l "'$dev lut':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_uds() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
	$mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_uds_bru() {
	local bru_output=$(vsp1_count_bru_inputs)

	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
	$mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev bru':0 [1]"
	$mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_uds_sru() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
	$mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev sru':0 [1]"
	$mediactl -d $mdev -l "'$dev sru':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_sru() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev sru':0 [1]"
	$mediactl -d $mdev -l "'$dev sru':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_sru_uds() {
	$mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev sru':0 [1]"
	$mediactl -d $mdev -l "'$dev sru':1 -> '$dev uds.0':0 [1]"
	$mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
}

pipe_rpf_wpf() {
	local rpf=$1
	local wpf=$2

	$mediactl -d $mdev -l "'$dev rpf.$rpf':1 -> '$dev wpf.$wpf':0 [1]"
	$mediactl -d $mdev -l "'$dev wpf.$wpf':1 -> '$dev wpf.$wpf output':0 [1]"

	__vsp_wpf_index=$wpf
}

pipe_reset() {
	$mediactl -d $mdev -r

	__vsp_bru_inputs=
	__vsp_rpf_format=
	__vsp_wpf_index=0
	__vsp_wpf_format=
	__vsp_pixel_perfect=true
}

pipe_configure() {
	local pipe=${1//-/_}
	shift 1

	pipe_reset
	pipe_$pipe $*

	__vsp_pipe=$pipe
}

# ------------------------------------------------------------------------------
# Format Configuration
#

format_v4l2_to_mbus() {
	case $1 in
	RGB332 | ARGB555 | XRGB555 | RGB565 | BGR24 | RGB24 | XBGR32 | XRGB32 | ABGR32 | ARGB32)
		echo "ARGB32";
		;;

	HSV24 | HSV32)
		echo "AHSV8888_1X32";
		;;

	UYVY | VYUY | YUYV | YVYU | NV12M | NV16M | NV21M | NV61M | YUV420M | YUV422M | YUV444M | YVU420M | YVU422M | YVU444M)
		echo "AYUV32"
		;;

	*)
		echo "Invalid format $1" >&2
		echo -e "Valid formats are
\tRGB332, ARGB555, XRGB555, RGB565, BGR24, RGB24,
\tXBGR32, XRGB32, ABGR32, ARGB32, HSV24, HSV32
\tUYVY, VYUY, YUYV, YVYU,
\tNV12M, NV16M, NV21M, NV61M,
\tYUV420M, YUV422M, YUV444M,
\tYVU420M, YVU422M, YVU444M" >&2
		exit 1
	esac
}

format_v4l2_is_yuv() {
	local format=$(format_v4l2_to_mbus $1)
	[ $format = 'AYUV32' ]
}

format_rpf() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2
	local rpf=$3

	$mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$format/$size]"

	__vsp_rpf_format=$1
}

format_rpf_bru() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2
	local ninputs=$3
	local offset=0

	local bru_output=$(vsp1_count_bru_inputs)

	for input in `seq 0 1 $((ninputs-1))` ; do
		offset=$((offset+50))
		$mediactl -d $mdev -V "'$dev rpf.$input':0 [fmt:$format/$size]"
		$mediactl -d $mdev -V "'$dev bru':$input   [fmt:$format/$size compose:($offset,$offset)/$size]"
	done

	$mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"

	__vsp_rpf_format=$1
	__vsp_wpf_format=$1
}

format_rpf_bru_uds() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local outfmt=$(format_v4l2_to_mbus $3)
	local outsize=$4

	local bru_output=$(vsp1_count_bru_inputs)

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	[ $insize != $outsize ] && __vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$3
}

format_rpf_clu() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev clu':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev clu':1 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"

	__vsp_rpf_format=$1
	__vsp_wpf_format=$1
}

format_rpf_hst() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev hst':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev hst':1 [fmt:AHSV8888_1X32/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:AHSV8888_1X32/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:AHSV8888_1X32/$size]"

	__vsp_rpf_format=$1
	__vsp_wpf_format=$3
}

format_rpf_hgo() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2
	local crop=${3:+crop:$3}
	local compose=${4:+compose:$4}

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev hgo':0   [fmt:$format/$size $crop $compose]"

	__vsp_rpf_format=$1
	__vsp_wpf_format=$1
}

format_rpf_lut() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev lut':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev lut':1 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"

	__vsp_rpf_format=$1
	__vsp_wpf_format=$1
}

format_rpf_uds() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local outfmt=$(format_v4l2_to_mbus $3)
	local outsize=$4

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	[ $insize != $outsize ] && __vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$3
}

format_rpf_uds_bru() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local outfmt=$(format_v4l2_to_mbus $3)
	local outsize=$4

	local bru_output=$(vsp1_count_bru_inputs)

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	[ $insize != $outsize ] && __vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$3
}

format_rpf_uds_sru() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local midsize=$3
	local outfmt=$(format_v4l2_to_mbus $4)
	local outsize=$5

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$midsize]"
	$mediactl -d $mdev -V "'$dev sru':0 [fmt:$infmt/$midsize]"
	$mediactl -d $mdev -V "'$dev sru':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	__vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$4
}

format_rpf_sru() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local outfmt=$(format_v4l2_to_mbus $3)
	local outsize=$4

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev sru':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev sru':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	__vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$3
}

format_rpf_sru_uds() {
	local infmt=$(format_v4l2_to_mbus $1)
	local insize=$2
	local midsize=$3
	local outfmt=$(format_v4l2_to_mbus $4)
	local outsize=$5

	$mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev sru':0 [fmt:$infmt/$insize]"
	$mediactl -d $mdev -V "'$dev sru':1 [fmt:$infmt/$midsize]"
	$mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$midsize]"
	$mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
	$mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"

	__vsp_pixel_perfect=false
	__vsp_rpf_format=$1
	__vsp_wpf_format=$4
}

format_rpf_wpf() {
	local rpf=$1
	local wpf=$2
	local infmt=$(format_v4l2_to_mbus $3)
	local size=$4
	local outfmt=$(format_v4l2_to_mbus $5)
	local rpfcrop=
	local wpfcrop=
	local rpfoutsize=
	local outsize=
	local option=

	__vsp_rpf_format=$3
	__vsp_wpf_format=$5

	shift 5

	for option in $* ; do
		case $option in
		--rpfcrop=*)
			rpfcrop=${option/--rpfcrop=/}
			;;

		--wpfcrop=*)
			wpfcrop=${option/--wpfcrop=/}
			;;
		*)
			echo "format_rpf_wpf: Unrecognised argument $option"
			return 1
			;;
		esac
	done

	if [ x$rpfcrop != 'x' ] ; then
		rpfcrop="crop:$rpfcrop"
		rpfoutsize=$(echo $rpfcrop | sed 's/.*\///')
	else
		rpfoutsize=$size
	fi

	if [ x$wpfcrop != 'x' ] ; then
		wpfcrop="crop:$wpfcrop"
		outsize=$(echo $wpfcrop | sed 's/.*\///')
	else
		outsize=$rpfoutsize
	fi

	$mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$infmt/$size $rpfcrop]"
	$mediactl -d $mdev -V "'$dev rpf.$rpf':1 [fmt:$infmt/$rpfoutsize]"
	$mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$infmt/$rpfoutsize $wpfcrop]"
	$mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$outfmt/$outsize]"
}

format_wpf() {
	local format=$(format_v4l2_to_mbus $1)
	local size=$2
	local wpf=$3