1 page.title=Graphics 2 @jd:body 3 4 <!-- 5 Copyright 2014 The Android Open Source Project 6 7 Licensed under the Apache License, Version 2.0 (the "License"); 8 you may not use this file except in compliance with the License. 9 You may obtain a copy of the License at 10 11 http://www.apache.org/licenses/LICENSE-2.0 12 13 Unless required by applicable law or agreed to in writing, software 14 distributed under the License is distributed on an "AS IS" BASIS, 15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 See the License for the specific language governing permissions and 17 limitations under the License. 18 --> 19 20 <div id="qv-wrapper"> 21 <div id="qv"> 22 <h2>In this document</h2> 23 <ol id="auto-toc"> 24 </ol> 25 </div> 26 </div> 27 28 <p>The Android framework offers a variety of graphics rendering APIs for 2D and 29 3D that interact with manufacturer implementations of graphics drivers, so it 30 is important to have a good understanding of how those APIs work at a higher 31 level. This page introduces the graphics hardware abstraction layer (HAL) upon 32 which those drivers are built.</p> 33 34 <p>Application developers draw images to the screen in two ways: with Canvas or 35 OpenGL. See <a 36 href="{@docRoot}devices/graphics/architecture.html">System-level graphics 37 architecture</a> for a detailed description of Android graphics 38 components.</p> 39 40 <p><a 41 href="http://developer.android.com/reference/android/graphics/Canvas.html">android.graphics.Canvas</a> 42 is a 2D graphics API and is the most popular graphics API among developers. 43 Canvas operations draw all the stock and custom <a 44 href="http://developer.android.com/reference/android/view/View.html">android.view.View</a>s 45 in Android. In Android, hardware acceleration for Canvas APIs is accomplished 46 with a drawing library called OpenGLRenderer that translates Canvas operations 47 to OpenGL operations so they can execute on the GPU.</p> 48 49 <p>Beginning in Android 4.0, hardware-accelerated Canvas is enabled by default. 50 Consequently, a hardware GPU that supports OpenGL ES 2.0 is mandatory for 51 Android 4.0 and later devices. See the <a 52 href="https://developer.android.com/guide/topics/graphics/hardware-accel.html">Hardware 53 Acceleration guide</a> for an explanation of how the hardware-accelerated 54 drawing path works and the differences in its behavior from that of the 55 software drawing path.</p> 56 57 <p>In addition to Canvas, the other main way that developers render graphics is 58 by using OpenGL ES to directly render to a surface. Android provides OpenGL ES 59 interfaces in the <a 60 href="http://developer.android.com/reference/android/opengl/package-summary.html">android.opengl</a> 61 package that developers can use to call into their GL implementations with the 62 SDK or with native APIs provided in the <a 63 href="https://developer.android.com/tools/sdk/ndk/index.html">Android 64 NDK</a>.</p> 65 66 <h2 id=android_graphics_components>Android graphics components</h2> 67 68 <p>No matter what rendering API developers use, everything is rendered onto a 69 "surface." The surface represents the producer side of a buffer queue that is 70 often consumed by SurfaceFlinger. Every window that is created on the Android 71 platform is backed by a surface. All of the visible surfaces rendered are 72 composited onto the display by SurfaceFlinger.</p> 73 74 <p>The following diagram shows how the key components work together:</p> 75 76 <img src="graphics/images/graphics_surface.png" alt="image-rendering components"> 77 78 <p class="img-caption"><strong>Figure 1.</strong> How surfaces are rendered</p> 79 80 <p>The main components are described below:</p> 81 82 <h3 id=image_stream_producers>Image Stream Producers</h3> 83 84 <p>An image stream producer can be anything that produces graphic buffers for 85 consumption. Examples include OpenGL ES, Canvas 2D, and mediaserver video 86 decoders.</p> 87 88 <h3 id=image_stream_consumers>Image Stream Consumers</h3> 89 90 <p>The most common consumer of image streams is SurfaceFlinger, the system 91 service that consumes the currently visible surfaces and composites them onto 92 the display using information provided by the Window Manager. SurfaceFlinger is 93 the only service that can modify the content of the display. SurfaceFlinger 94 uses OpenGL and the Hardware Composer to compose a group of surfaces.</p> 95 96 <p>Other OpenGL ES apps can consume image streams as well, such as the camera 97 app consuming a camera preview image stream. Non-GL applications can be 98 consumers too, for example the ImageReader class.</p> 99 100 <h3 id=window_manager>Window Manager</h3> 101 102 <p>The Android system service that controls a window, which is a container for 103 views. A window is always backed by a surface. This service oversees 104 lifecycles, input and focus events, screen orientation, transitions, 105 animations, position, transforms, z-order, and many other aspects of a window. 106 The Window Manager sends all of the window metadata to SurfaceFlinger so 107 SurfaceFlinger can use that data to composite surfaces on the display.</p> 108 109 <h3 id=hardware_composer>Hardware Composer</h3> 110 111 <p>The hardware abstraction for the display subsystem. SurfaceFlinger can 112 delegate certain composition work to the Hardware Composer to offload work from 113 OpenGL and the GPU. SurfaceFlinger acts as just another OpenGL ES client. So 114 when SurfaceFlinger is actively compositing one buffer or two into a third, for 115 instance, it is using OpenGL ES. This makes compositing lower power than having 116 the GPU conduct all computation.</p> 117 118 <p>The Hardware Composer HAL conducts the other half of the work. This HAL is 119 the central point for all Android graphics rendering. Hardware Composer must 120 support events, one of which is VSYNC. Another is hotplug for plug-and-play 121 HDMI support.</p> 122 123 <p>See the <a href="{@docRoot}devices/graphics.html#hardware_composer_hal">Hardware Composer 124 HAL</a> section for more information.</p> 125 126 <h3 id=gralloc>Gralloc</h3> 127 128 <p>The graphics memory allocator is needed to allocate memory that is requested 129 by image producers. See the <a 130 href="{@docRoot}devices/graphics.html#gralloc">Gralloc HAL</a> section for more 131 information.</p> 132 133 <h2 id=data_flow>Data flow</h2> 134 135 <p>See the following diagram for a depiction of the Android graphics 136 pipeline:</p> 137 138 <img src="graphics/images/graphics_pipeline.png" alt="graphics data flow"> 139 140 <p class="img-caption"><strong>Figure 2.</strong> How graphic data flow through 141 Android</p> 142 143 <p>The objects on the left are renderers producing graphics buffers, such as 144 the home screen, status bar, and system UI. SurfaceFlinger is the compositor 145 and Hardware Composer is the composer.</p> 146 147 <h3 id=bufferqueue>BufferQueue</h3> 148 149 <p>BufferQueues provide the glue between the Android graphics components. These 150 are a pair of queues that mediate the constant cycle of buffers from the 151 producer to the consumer. Once the producers hand off their buffers, 152 SurfaceFlinger is responsible for compositing everything onto the display.</p> 153 154 <p>See the following diagram for the BufferQueue communication process.</p> 155 156 <img src="graphics/images/bufferqueue.png" alt="BufferQueue communication process"> 157 158 <p class="img-caption"><strong>Figure 3.</strong> BufferQueue communication 159 process</p> 160 161 <p>BufferQueue contains the logic that ties image stream producers and image 162 stream consumers together. Some examples of image producers are the camera 163 previews produced by the camera HAL or OpenGL ES games. Some examples of image 164 consumers are SurfaceFlinger or another app that displays an OpenGL ES stream, 165 such as the camera app displaying the camera viewfinder.</p> 166 167 <p>BufferQueue is a data structure that combines a buffer pool with a queue and 168 uses Binder IPC to pass buffers between processes. The producer interface, or 169 what you pass to somebody who wants to generate graphic buffers, is 170 IGraphicBufferProducer (part of <a 171 href="http://developer.android.com/reference/android/graphics/SurfaceTexture.html">SurfaceTexture</a>). 172 BufferQueue is often used to render to a Surface and consume with a GL 173 Consumer, among other tasks. 174 175 BufferQueue can operate in three different modes:</p> 176 177 <p><em>Synchronous-like mode</em> - BufferQueue by default operates in a 178 synchronous-like mode, in which every buffer that comes in from the producer 179 goes out at the consumer. No buffer is ever discarded in this mode. And if the 180 producer is too fast and creates buffers faster than they are being drained, it 181 will block and wait for free buffers.</p> 182 183 <p><em>Non-blocking mode</em> - BufferQueue can also operate in a non-blocking 184 mode where it generates an error rather than waiting for a buffer in those 185 cases. No buffer is ever discarded in this mode either. This is useful for 186 avoiding potential deadlocks in application software that may not understand 187 the complex dependencies of the graphics framework.</p> 188 189 <p><em>Discard mode</em> - Finally, BufferQueue may be configured to discard 190 old buffers rather than generate errors or wait. For instance, if conducting GL 191 rendering to a texture view and drawing as quickly as possible, buffers must be 192 dropped.</p> 193 194 <p>To conduct most of this work, SurfaceFlinger acts as just another OpenGL ES 195 client. So when SurfaceFlinger is actively compositing one buffer or two into a 196 third, for instance, it is using OpenGL ES.</p> 197 198 <p>The Hardware Composer HAL conducts the other half of the work. This HAL acts 199 as the central point for all Android graphics rendering.</p> 200 201 <h3 id=synchronization_framework>Synchronization framework</h3> 202 203 <p>Since Android graphics offer no explicit parallelism, vendors have long 204 implemented their own implicit synchronization within their own drivers. This 205 is no longer required with the Android graphics synchronization framework. See 206 the <a href="#explicit_synchronization">Explicit synchronization</a> section 207 for implementation instructions.</p> 208 209 <p>The synchronization framework explicitly describes dependencies between 210 different asynchronous operations in the system. The framework provides a 211 simple API that lets components signal when buffers are released. It also 212 allows synchronization primitives to be passed between drivers from the kernel 213 to userspace and between userspace processes themselves.</p> 214 215 <p>For example, an application may queue up work to be carried out in the GPU. 216 The GPU then starts drawing that image. Although the image hasnt been drawn 217 into memory yet, the buffer pointer can still be passed to the window 218 compositor along with a fence that indicates when the GPU work will be 219 finished. The window compositor may then start processing ahead of time and 220 hand off the work to the display controller. In this manner, the CPU work can 221 be done ahead of time. Once the GPU finishes, the display controller can 222 immediately display the image.</p> 223 224 <p>The synchronization framework also allows implementers to leverage 225 synchronization resources in their own hardware components. Finally, the 226 framework provides visibility into the graphics pipeline to aid in 227 debugging.</p> 228