xref: /aosp_15_r20/external/mesa3d/docs/drivers/vc4.rst (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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