1*61046927SAndroid Build Coastguard WorkerVC4 2*61046927SAndroid Build Coastguard Worker=== 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard WorkerMesa's VC4 graphics driver supports multiple implementations of 5*61046927SAndroid Build Coastguard WorkerBroadcom's VideoCore IV GPU. It is notably used in the Raspberry Pi 0 6*61046927SAndroid Build Coastguard Workerthrough Raspberry Pi 3 hardware, and the driver is included as an 7*61046927SAndroid Build Coastguard Workeroption as of the 2016-02-09 Raspbian release using ``raspi-config``. 8*61046927SAndroid Build Coastguard WorkerOn most other distributions such as Debian or Fedora, you need no 9*61046927SAndroid Build Coastguard Workerconfiguration to enable the driver. 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard WorkerThis Mesa driver talks directly to the `VC4 12*61046927SAndroid Build Coastguard Worker<https://www.kernel.org/doc/html/latest/gpu/vc4.html>`__ kernel DRM 13*61046927SAndroid Build Coastguard Workerdriver for scheduling graphics commands, and that module also provides 14*61046927SAndroid Build Coastguard WorkerKMS display support. The driver makes no use of the closed source VPU 15*61046927SAndroid Build Coastguard Workerfirmware on the VideoCore IV block, instead talking directly to the 16*61046927SAndroid Build Coastguard WorkerGPU block from Linux. 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard WorkerGLES2 support 19*61046927SAndroid Build Coastguard Worker------------- 20*61046927SAndroid Build Coastguard Worker 21*61046927SAndroid Build Coastguard WorkerThe VC4 driver is a nearly conformant GLES2 driver, and the hardware 22*61046927SAndroid Build Coastguard Workerhas achieved GLES2 conformance with other driver stacks. 23*61046927SAndroid Build Coastguard Worker 24*61046927SAndroid Build Coastguard WorkerOpenGL support 25*61046927SAndroid Build Coastguard Worker-------------- 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard WorkerAlong with GLES 2.0, the Mesa driver also exposes OpenGL 2.1, which is 28*61046927SAndroid Build Coastguard Workermostly correct but with a few caveats. 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker* 4-byte index buffers. 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard WorkerGLES2.0, and VC4, don't have ``GL_UNSIGNED_INT`` index buffers. To support 33*61046927SAndroid Build Coastguard Workerthem in VC4, we create a shadow copy of your index buffer with the 34*61046927SAndroid Build Coastguard Workerindices truncated to 2 bytes. This is incorrect (and will assertion 35*61046927SAndroid Build Coastguard Workerfail in debug builds of Mesa) if any of the indices were >65535. To 36*61046927SAndroid Build Coastguard Workerfix that, we would need to detect this case and rewrite the index 37*61046927SAndroid Build Coastguard Workerbuffer and vertex buffers to do a series of draws each with small 38*61046927SAndroid Build Coastguard Workerindices and new vertex attrib bindings. 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard WorkerTo avoid this problem, ensure that all index buffers are written using 41*61046927SAndroid Build Coastguard Worker``GL_UNSIGNED_SHORT``, even at the cost of doing multiple draw calls 42*61046927SAndroid Build Coastguard Workerwith updated vertex attrib bindings. 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker* Occlusion queries 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard WorkerThe VC4 hardware has no support for occlusion queries. GL 2.0 47*61046927SAndroid Build Coastguard Workerrequires that you support the occlusion queries extension, but you can 48*61046927SAndroid Build Coastguard Workerreport 0 from ``glGetQueryiv(GL_SAMPLES_PASSED, 49*61046927SAndroid Build Coastguard WorkerGL_QUERY_COUNTER_BITS)``. This is absurd, but it's how OpenGL handles 50*61046927SAndroid Build Coastguard Worker"we want the functions to be present everywhere, but we want it to be 51*61046927SAndroid Build Coastguard Workeroptional for hardware to support it. Sadly, gallium doesn't yet allow 52*61046927SAndroid Build Coastguard Workerthe driver to report 0 query bits. 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker* Primitive mode 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard WorkerVC4 doesn't support reducing triangles/quads/polygons to lines and 57*61046927SAndroid Build Coastguard Workerpoints like desktop GL. If front/back mode matched, we could rewrite 58*61046927SAndroid Build Coastguard Workerthe index buffer to the new primitive type, but we don't. If 59*61046927SAndroid Build Coastguard Workerfront/back mode don't match, we would need to run the vertex shader in 60*61046927SAndroid Build Coastguard Workersoftware, classify the prims, write new index buffers, and emit 61*61046927SAndroid Build Coastguard Worker(possibly many) new draw calls to rasterize the new prims in the same 62*61046927SAndroid Build Coastguard Workerorder. 63*61046927SAndroid Build Coastguard Worker 64*61046927SAndroid Build Coastguard WorkerBug Reporting 65*61046927SAndroid Build Coastguard Worker------------- 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard WorkerVC4 rendering bugs should go to Mesa's GitLab `issues 68*61046927SAndroid Build Coastguard Worker<https://gitlab.freedesktop.org/mesa/mesa/-/issues>`__ page. 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard WorkerBy far the easiest way to communicate bug reports for rendering 71*61046927SAndroid Build Coastguard Workerproblems is to take an apitrace. This passes exactly the drawing you 72*61046927SAndroid Build Coastguard Workersaw to the developer, without the developer needing to download and 73*61046927SAndroid Build Coastguard Workerbuild the application and replicate whatever steps you took to produce 74*61046927SAndroid Build Coastguard Workerthe problem. Traces attached to bug reports should ideally be small. 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard WorkerFor GPU hangs, if you can get a short apitrace that produces the 77*61046927SAndroid Build Coastguard Workerproblem, that's still the best. If the problem takes a long time to 78*61046927SAndroid Build Coastguard Workerreproduce or you can't capture it in a trace, describing how to 79*61046927SAndroid Build Coastguard Workerreproduce and including a GPU hang dump would be the most 80*61046927SAndroid Build Coastguard Workeruseful. Install `vc4-gpu-tools 81*61046927SAndroid Build Coastguard Worker<https://github.com/anholt/vc4-gpu-tools/>`__ and use 82*61046927SAndroid Build Coastguard Worker``vc4_dump_hang_state my-app.hang``. Sometimes the hang file will 83*61046927SAndroid Build Coastguard Workerprovide useful information. 84*61046927SAndroid Build Coastguard Worker 85*61046927SAndroid Build Coastguard WorkerTiled Rendering 86*61046927SAndroid Build Coastguard Worker--------------- 87*61046927SAndroid Build Coastguard Worker 88*61046927SAndroid Build Coastguard WorkerVC4 is a tiled renderer, chopping the screen into 64x64 (non-MSAA) or 89*61046927SAndroid Build Coastguard Worker32x32 (MSAA) tiles and rendering the scene per tile. Rasterization 90*61046927SAndroid Build Coastguard Workerlooks like:: 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard Worker (CPU) Allocate space to store a list of draw commands per tile 93*61046927SAndroid Build Coastguard Worker (CPU) Set up a command list per tile that does: 94*61046927SAndroid Build Coastguard Worker Either load the current tile's color buffer from memory, or clear it. 95*61046927SAndroid Build Coastguard Worker Either load the current tile's depth buffer from memory, or clear it. 96*61046927SAndroid Build Coastguard Worker Branch into the draw list for the tile 97*61046927SAndroid Build Coastguard Worker Store the depth buffer if anybody might read it. 98*61046927SAndroid Build Coastguard Worker Store the color buffer if anybody might read it. 99*61046927SAndroid Build Coastguard Worker (GPU) Initialize the per-tile draw call lists to empty. 100*61046927SAndroid Build Coastguard Worker (GPU) Run all draw calls collecting vertex data 101*61046927SAndroid Build Coastguard Worker (GPU) For each tile covered by a draw call's primitive. 102*61046927SAndroid Build Coastguard Worker Emit state packets to the list to update it to the current draw call's state. 103*61046927SAndroid Build Coastguard Worker Emit a primitive description into the tile's draw call list. 104*61046927SAndroid Build Coastguard Worker 105*61046927SAndroid Build Coastguard WorkerTiled rendering avoids the need for large render target caches, at the 106*61046927SAndroid Build Coastguard Workerexpense of increasing the cost of vertex processing. Unlike some tiled 107*61046927SAndroid Build Coastguard Workerrenderers, VC4 has no non-tiled rendering mode. 108*61046927SAndroid Build Coastguard Worker 109*61046927SAndroid Build Coastguard WorkerPerformance Tricks 110*61046927SAndroid Build Coastguard Worker------------------ 111*61046927SAndroid Build Coastguard Worker 112*61046927SAndroid Build Coastguard Worker* Reducing memory bandwidth by clearing. 113*61046927SAndroid Build Coastguard Worker 114*61046927SAndroid Build Coastguard WorkerEven if your drawing is going to cover the entire render target, it's 115*61046927SAndroid Build Coastguard Workermore efficient for VC4 if you emit a ``glClear()`` of the color and 116*61046927SAndroid Build Coastguard Workerdepth buffers. This means we can skip the load of the previous state 117*61046927SAndroid Build Coastguard Workerfrom memory, in favor of a cheap GPU-side ``memset()`` of the tile 118*61046927SAndroid Build Coastguard Workerbuffer before we start running the draw calls. 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker* Reducing memory bandwidth with scissoring. 121*61046927SAndroid Build Coastguard Worker 122*61046927SAndroid Build Coastguard WorkerIf all draw calls for the frame are with a ``glScissor()`` to only 123*61046927SAndroid Build Coastguard Workerpart of the screen, then we can skip setting up the tiles for that 124*61046927SAndroid Build Coastguard Workerarea, which means a little less memory used setting up the empty bins, 125*61046927SAndroid Build Coastguard Workerand a lot less memory used loading/storing the unchanged tiles. 126*61046927SAndroid Build Coastguard Worker 127*61046927SAndroid Build Coastguard Worker* Reducing memory bandwidth with ``glInvalidateFramebuffer()``. 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard WorkerIf we don't know who might use the contents of the framebuffer's depth 130*61046927SAndroid Build Coastguard Workeror color in the future, then we have to store it for later. If you use 131*61046927SAndroid Build Coastguard WorkerglInvalidateFramebuffer() before accessing the results of your 132*61046927SAndroid Build Coastguard Workerrendering, then we can skip the store of the depth or color 133*61046927SAndroid Build Coastguard Workerbuffer. Note that this is unimplemented. 134*61046927SAndroid Build Coastguard Worker 135*61046927SAndroid Build Coastguard Worker* Avoid non-constant GLSL array indexing 136*61046927SAndroid Build Coastguard Worker 137*61046927SAndroid Build Coastguard WorkerIn VC4 the only non-constant-index array access supported in hardware 138*61046927SAndroid Build Coastguard Workeris uniforms. For everything else (inputs, outputs, temporaries), we 139*61046927SAndroid Build Coastguard Workerhave to lower them to an IF ladder like:: 140*61046927SAndroid Build Coastguard Worker 141*61046927SAndroid Build Coastguard Worker if (index == 0) 142*61046927SAndroid Build Coastguard Worker return array[0] 143*61046927SAndroid Build Coastguard Worker else if (index == 1) 144*61046927SAndroid Build Coastguard Worker return array[1] 145*61046927SAndroid Build Coastguard Worker ... 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard WorkerThis is very expensive as we probably have to execute every branch of 148*61046927SAndroid Build Coastguard Workerevery IF statement due to it being a SIMD machine. So, it is 149*61046927SAndroid Build Coastguard Workerrecommended (if you can) to avoid non-uniform non-constant array 150*61046927SAndroid Build Coastguard Workerindexing. 151*61046927SAndroid Build Coastguard Worker 152*61046927SAndroid Build Coastguard WorkerNote that if you do variable indexing within a bounded loop that Mesa 153*61046927SAndroid Build Coastguard Workercan unroll, that can actually count as constant indexing. 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker* Increasing GPU memory Increase CMA pool size 156*61046927SAndroid Build Coastguard Worker 157*61046927SAndroid Build Coastguard WorkerThe memory for the VC4 driver is allocated from the standard Linux CMA 158*61046927SAndroid Build Coastguard Workerpool. The size of this pool defaults to 64 MB. To increase this, pass 159*61046927SAndroid Build Coastguard Workeran additional parameter on the kernel command line. Edit the boot 160*61046927SAndroid Build Coastguard Workerpartition's ``cmdline.txt`` to add:: 161*61046927SAndroid Build Coastguard Worker 162*61046927SAndroid Build Coastguard Worker cma=256M@256M 163*61046927SAndroid Build Coastguard Worker 164*61046927SAndroid Build Coastguard Worker``cmdline.txt`` is a single line with whitespace separated parameters. 165*61046927SAndroid Build Coastguard Worker 166*61046927SAndroid Build Coastguard WorkerThe first value is the size of the pool and the second parameter is 167*61046927SAndroid Build Coastguard Workerthe start address of the pool. The pool size can be increased further, 168*61046927SAndroid Build Coastguard Workerbut it must fit into the memory, so size + start address must be below 169*61046927SAndroid Build Coastguard Worker1024M (Pi 2, 3, 3+) or 512M (Pi B, B+, Zero, Zero W). Also this 170*61046927SAndroid Build Coastguard Workerreduces the memory available to Linux. 171*61046927SAndroid Build Coastguard Worker 172*61046927SAndroid Build Coastguard Worker* Decrease firmware memory 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard WorkerThe firmware allocates a fixed chunk of memory before booting 175*61046927SAndroid Build Coastguard WorkerLinux. If firmware functions are not required, this amount can be 176*61046927SAndroid Build Coastguard Workerreduced. 177*61046927SAndroid Build Coastguard Worker 178*61046927SAndroid Build Coastguard WorkerIn ``config.txt`` edit ``gpu_mem`` to 16, if you do not need video decoding, 179*61046927SAndroid Build Coastguard Workeredit gpu_mem to 64 if you need video decoding. 180*61046927SAndroid Build Coastguard Worker 181*61046927SAndroid Build Coastguard WorkerPerformance debugging 182*61046927SAndroid Build Coastguard Worker--------------------- 183*61046927SAndroid Build Coastguard Worker 184*61046927SAndroid Build Coastguard Worker* Step 1: Known issues 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard WorkerThe first tool to look at is running your application with the 187*61046927SAndroid Build Coastguard Workerenvironment variable ``VC4_DEBUG=perf`` set. This will report debug 188*61046927SAndroid Build Coastguard Workerinformation for many known causes of performance problems on the 189*61046927SAndroid Build Coastguard Workerconsole. Not all of them will cause visible performance improvements 190*61046927SAndroid Build Coastguard Workerwhen fixed, but it's a good first step to see what might going wrong. 191*61046927SAndroid Build Coastguard Worker 192*61046927SAndroid Build Coastguard Worker* Step 2: CPU vs GPU 193*61046927SAndroid Build Coastguard Worker 194*61046927SAndroid Build Coastguard WorkerThe primary question is figuring out whether the CPU is busy in your 195*61046927SAndroid Build Coastguard Workerapplication, the CPU is busy in the GL driver, the GPU is waiting for 196*61046927SAndroid Build Coastguard Workerthe CPU, or the CPU is waiting for the GPU. Ideally, you get to the 197*61046927SAndroid Build Coastguard Workerpoint where the CPU is waiting for the GPU infrequently but for a 198*61046927SAndroid Build Coastguard Workersignificant amount of time (however long it takes the GPU to draw a 199*61046927SAndroid Build Coastguard Workerframe). 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard WorkerStart with top while your application is running. Is the CPU usage 202*61046927SAndroid Build Coastguard Workeraround 90%+? If so, then our performance analysis will be with 203*61046927SAndroid Build Coastguard Workersysprof. If it's not very high, is the GPU staying busy? We don't have 204*61046927SAndroid Build Coastguard Workera clean tool for this yet, but ``cat /debug/dri/0/v3d_regs`` could be 205*61046927SAndroid Build Coastguard Workeruseful. If ``CT0CA`` != ``CT0EA`` or ``CT1CA`` != ``CT1EA``, that 206*61046927SAndroid Build Coastguard Workermeans that the GPU is currently busy processing some rendering job. 207*61046927SAndroid Build Coastguard Worker 208*61046927SAndroid Build Coastguard Worker* sysprof for CPU usage 209*61046927SAndroid Build Coastguard Worker 210*61046927SAndroid Build Coastguard WorkerIf the CPU is totally busy and the GPU isn't terribly busy, there is 211*61046927SAndroid Build Coastguard Workeran excellent tool for debugging: sysprof. Install, run as root (so you 212*61046927SAndroid Build Coastguard Workercan get system-wide profiling), hit play and later stop. The top-left 213*61046927SAndroid Build Coastguard Workerarea shows the flat profile sorted by total time of that symbol plus 214*61046927SAndroid Build Coastguard Workerits descendants. The top few are generally uninteresting (main() and 215*61046927SAndroid Build Coastguard Workerits descendants consuming a lot), but eventually you can get down to 216*61046927SAndroid Build Coastguard Workersomething interesting. Click it, and to the right you get the 217*61046927SAndroid Build Coastguard Workercallchains to descendants -- where all that time actually went. On the 218*61046927SAndroid Build Coastguard Workerother hand, the lower left shows callers -- double-clicking those 219*61046927SAndroid Build Coastguard Workerselects that as the symbol to view, instead. 220*61046927SAndroid Build Coastguard Worker 221*61046927SAndroid Build Coastguard WorkerNote that you need debug symbols for the callgraphs in sysprof to 222*61046927SAndroid Build Coastguard Workerwork, which is where most of its value is. Most distributions offer 223*61046927SAndroid Build Coastguard Workerdebug symbol packages from their builds which can be installed 224*61046927SAndroid Build Coastguard Workerseparately, and sysprof will find them. I've found that on arm, the 225*61046927SAndroid Build Coastguard Workerdebug packages are not enough, and if someone could determine what is 226*61046927SAndroid Build Coastguard Workernecessary for callgraphs in debugging, that would be really helpful. 227*61046927SAndroid Build Coastguard Worker 228*61046927SAndroid Build Coastguard Worker* perf for CPU waits on GPU 229*61046927SAndroid Build Coastguard Worker 230*61046927SAndroid Build Coastguard WorkerIf the CPU is not very busy and the GPU is not very busy, then we're 231*61046927SAndroid Build Coastguard Workerprobably ping-ponging between the two. Most cases of this would be 232*61046927SAndroid Build Coastguard Workernoticed by ``VC4_DEBUG=perf``, but not all. To see all cases where 233*61046927SAndroid Build Coastguard Workerthis happens, use the perf tool from the Linux kernel (note: unrelated 234*61046927SAndroid Build Coastguard Workerto ``VC4_DEBUG=perf``):: 235*61046927SAndroid Build Coastguard Worker 236*61046927SAndroid Build Coastguard Worker sudo perf record -f -g -e vc4:vc4_wait_for_seqno_begin -c 1 openarena 237*61046927SAndroid Build Coastguard Worker 238*61046927SAndroid Build Coastguard WorkerIf you want to see the whole system's stalls for a period of time 239*61046927SAndroid Build Coastguard Worker(very useful!), use the -a flag instead of a particular command 240*61046927SAndroid Build Coastguard Workername. Just ``^C`` when you're done capturing data. 241*61046927SAndroid Build Coastguard Worker 242*61046927SAndroid Build Coastguard WorkerAt exit, you'll have ``perf.data`` in the current directory. You can print 243*61046927SAndroid Build Coastguard Workerout the results with:: 244*61046927SAndroid Build Coastguard Worker 245*61046927SAndroid Build Coastguard Worker perf report | less 246*61046927SAndroid Build Coastguard Worker 247*61046927SAndroid Build Coastguard Worker* Debugging for GPU fully busy 248*61046927SAndroid Build Coastguard Worker 249*61046927SAndroid Build Coastguard WorkerAs of Linux kernel 4.17 and Mesa 18.1, we now expose the hardware's 250*61046927SAndroid Build Coastguard Workerperformance counters in OpenGL. Install apitrace, and trace your 251*61046927SAndroid Build Coastguard Workerapplication with:: 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker apitrace trace <application> # for GLX applications 254*61046927SAndroid Build Coastguard Worker apitrace trace -a egl <application> # for EGL applications 255*61046927SAndroid Build Coastguard Worker 256*61046927SAndroid Build Coastguard WorkerOnce you've captured a trace, you can see what counters are available 257*61046927SAndroid Build Coastguard Workerand replay it while looking while looking at some of those counters:: 258*61046927SAndroid Build Coastguard Worker 259*61046927SAndroid Build Coastguard Worker apitrace replay <application>.trace --list-metrics 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker apitrace replay <application>.trace --pdraw=GL_AMD_performance_monitor:QPU-total-clk-cycles-vertex-coord-shading 262*61046927SAndroid Build Coastguard Worker 263*61046927SAndroid Build Coastguard WorkerMultiple counters can be captured at once with commas separating them. 264*61046927SAndroid Build Coastguard Worker 265*61046927SAndroid Build Coastguard WorkerOnce you've found what draw calls are surprisingly expensive in one of 266*61046927SAndroid Build Coastguard Workerthe counters, you can work out which ones they were at the GL level by 267*61046927SAndroid Build Coastguard Workeropening the trace up in qapitrace and using ``^-G`` to jump to that call 268*61046927SAndroid Build Coastguard Workernumber and ``^-L`` to look up the GL state at that call. 269*61046927SAndroid Build Coastguard Worker 270*61046927SAndroid Build Coastguard WorkerTrace Testing 271*61046927SAndroid Build Coastguard Worker------------- 272*61046927SAndroid Build Coastguard Worker 273*61046927SAndroid Build Coastguard Workershader-db is often used as a proxy for real-world app performance when 274*61046927SAndroid Build Coastguard Workerworking on the compiler in Mesa. On VC4, there is a lot of 275*61046927SAndroid Build Coastguard Workerstate-dependent code in the shaders (like blending or vertex attribute 276*61046927SAndroid Build Coastguard Workerformat handling), so the typical `shader-db 277*61046927SAndroid Build Coastguard Worker<https://gitlab.freedesktop.org/mesa/shader-db>`__ will miss important 278*61046927SAndroid Build Coastguard Workerareas for optimization. Piglit can instead test apitraces, such as 279*61046927SAndroid Build Coastguard Workerthose captured in 280*61046927SAndroid Build Coastguard Worker`traces-db <https://gitlab.freedesktop.org/gfx-ci/tracie/traces-db/>`__. 281*61046927SAndroid Build Coastguard Worker 282*61046927SAndroid Build Coastguard WorkerHardware Documentation 283*61046927SAndroid Build Coastguard Worker---------------------- 284*61046927SAndroid Build Coastguard Worker 285*61046927SAndroid Build Coastguard WorkerFor driver developers, Broadcom publicly released a `specification 286*61046927SAndroid Build Coastguard Worker<https://docs.broadcom.com/doc/12358545>`__ PDF for the 21553, which 287*61046927SAndroid Build Coastguard Workeris closely related to the VC4 GPU present in the Raspberry Pi. They 288*61046927SAndroid Build Coastguard Workeralso released a `snapshot <https://docs.broadcom.com/docs/12358546>`__ 289*61046927SAndroid Build Coastguard Workerof a corresponding Android graphics driver. That graphics driver was 290*61046927SAndroid Build Coastguard Workerported to Raspbian for a demo, but was not expected to have ongoing 291*61046927SAndroid Build Coastguard Workerdevelopment. 292*61046927SAndroid Build Coastguard Worker 293*61046927SAndroid Build Coastguard WorkerDevelopers with NDA access with Broadcom or Raspberry Pi can 294*61046927SAndroid Build Coastguard Workerpotentially get access to "simpenrose", the C software simulator of 295*61046927SAndroid Build Coastguard Workerthe GPU. The Mesa driver includes a backend (``vc4_simulator.c``) to 296*61046927SAndroid Build Coastguard Workeruse simpenrose from an x86 system with the i915 graphics driver with 297*61046927SAndroid Build Coastguard Workerall of the VC4 rendering commands emulated on simpenrose and memcpyed 298*61046927SAndroid Build Coastguard Workerto the real GPU. 299