# Overview

Source: [https://docs.qualcomm.com/doc/80-70014-19/topic/graphics-overview.html](https://docs.qualcomm.com/doc/80-70014-19/topic/graphics-overview.html)

The graphics subsystem is powered by the Qualcomm^®^ Adreno™ GPU. The Adreno GPU
            is a three-dimensional (3D) graphics accelerator with 64‑bit addressing and incorporates
            graphics memory (GMEM). The GMEM serves as a dedicated memory for the graphics subsystem
            and facilitates Fast Z, color, and stencil rendering.

Additionally, the Adreno GPU supports the Qualcomm^®^ Universal Bandwidth
            Compression, enhancing the overall performance.

The Adreno GPU supports the following graphics and compute APIs: 
- **OpenGL ES**:  [3.0](https://registry.khronos.org/OpenGL/specs/es/3.0/es_spec_3.0.pdf), [3.1](https://registry.khronos.org/OpenGL/specs/es/3.1/es_spec_3.1.pdf), [3.2](https://registry.khronos.org/OpenGL/specs/es/3.2/es_spec_3.2.pdf)
- **OpenCL**: [1.2 FP](https://registry.khronos.org/OpenCL/specs/opencl-1.2.pdf), [2.0 FP](https://registry.khronos.org/SPIR-V/specs/1.0/OpenCL.std.20.pdf)
- **EGL**: [1.5](https://registry.khronos.org/EGL/specs/eglspec.1.5.pdf)
- **Vulkan**: [1.1](https://registry.khronos.org/vulkan/#vulkan1.1)

Note: The Qualcomm Linux platform allows you to develop
                applications for QCS6490 and QCS5430.

## Architecture

The following figure shows the architecture of the graphics subsystem.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export Graphics-driver.svg Page-2 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="12.1302in" height="9.02591in" viewbox="0 0 873.375 649.865" xml:space="preserve" color-interpolation-filters="sRGB" class="st22"><style>.svg-1 .st1 { fill: #f7f8fa; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st2 { fill: #3253dc; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st3 { fill: #ffffff; font-family: Arial; font-size: 1.16666em }
.svg-1 .st4 { fill: #acbacf; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st5 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st6 { fill: #ffffff; font-family: Arial; font-size: 1.00001em }
.svg-1 .st7 { font-size: 1em }
.svg-1 .st8 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st9 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st10 { fill: #000000; font-family: Arial; font-size: 1.00001em; font-weight: bold }
.svg-1 .st11 { marker-end: url("#mrkr5-54"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st12 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.31645569620253 }
.svg-1 .st13 { marker-end: url("#mrkr5-54"); marker-start: url("#mrkr5-86"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st14 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st15 { fill: #000000; font-family: Arial; font-size: 0.833336em }
.svg-1 .st16 { marker-end: url("#mrkr5-127"); marker-start: url("#mrkr5-125"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st17 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.23584905660377 }
.svg-1 .st18 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st19 { marker-start: url("#mrkr5-86"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st20 { fill: #ffffff; marker-end: url("#mrkr5-144"); stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st21 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313432835821 }
.svg-1 .st22 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend5">		<path d="M 2 1 L 0 0 L 1.98117 -0.993387 C 1.67173 -0.364515 1.67301 0.372641 1.98465 1.00043 " style="stroke:none"></path>	</g>	<marker id="mrkr5-54" class="st12" refx="-5.53" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-3.16,-3.16) "></use>	</marker>	<marker id="mrkr5-86" class="st12" refx="5.29" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(3.16) "></use>	</marker>	<marker id="mrkr5-125" class="st17" refx="7.06" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(4.24) "></use>	</marker>	<marker id="mrkr5-127" class="st17" refx="-7.42" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-4.24,-4.24) "></use>	</marker>	<marker id="mrkr5-144" class="st21" refx="-4.69" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-2.68,-2.68) "></use>	</marker></defs><g>	<title>Page-2</title>	<g id="shape54-1" transform="translate(18.375,-18.375)">		<title></title>		<rect x="0" y="36.75" width="836.625" height="613.115" class="st1"></rect>	</g>	<g id="shape1-3" transform="translate(325.375,-406.182)">		<title></title>		<desc>Adreno GPU driver</desc>		<rect x="0" y="558.497" width="306" height="91.3686" class="st2"></rect>		<text x="93.87" y="608.49" class="st3">Adreno GPU driver</text>		</g>	<g id="shape3-6" transform="translate(275.156,-575.025)">		<title></title>		<desc>Wayland client</desc>		<rect x="0" y="608.188" width="140.54" height="41.6777" class="st4"></rect>		<text x="31.25" y="632.63" class="st5">Wayland client</text>		</g>	<g id="shape4-9" transform="translate(430.888,-575.659)">		<title></title>		<desc>Weston (Compositor)</desc>		<rect x="0" y="609.319" width="290.487" height="40.5468" class="st4"></rect>		<text x="88.56" y="633.19" class="st5">Weston (Compositor)</text>		</g>	<g id="shape5-12" transform="translate(397.575,-218.24)">		<title></title>		<desc>KGSL driver</desc>		<rect x="0" y="611.082" width="137.053" height="38.7834" class="st2"></rect>		<text x="35.85" y="634.07" class="st6">KGSL driver</text>		</g>	<g id="shape6-15" transform="translate(620.322,-221.472)">		<title></title>		<desc>Display Kernel driver</desc>		<rect x="0" y="611.082" width="137.053" height="38.7834" class="st2"></rect>		<text x="13.17" y="634.07" class="st6">Display Kernel driver</text>		</g>	<g id="shape7-18" transform="translate(613.98,-354.153)">		<title></title>		<desc>Drm-backend (display)</desc>		<rect x="0" y="608.188" width="140.54" height="41.6777" class="st4"></rect>		<text x="9.92" y="632.63" class="st5">Drm-backend (display)</text>		</g>	<g id="shape8-21" transform="translate(38.8767,-411.258)">		<title></title>		<desc>Graphics buffer management</desc>		<rect x="0" y="608.188" width="133.716" height="41.6777" class="st4"></rect>		<text x="25.84" y="625.43" class="st5">Graphics buffer <tspan x="31.84" dy="1.2em" class="st7">management</tspan></text>		</g>	<g id="shape9-25" transform="translate(37.8273,-463.114)">		<title></title>		<desc>Wayland protocol</desc>		<rect x="0" y="608.188" width="134.765" height="41.6777" class="st4"></rect>		<text x="21.03" y="632.72" class="st5">Wayland protocol</text>		</g>	<g id="shape10-28" transform="translate(28.375,-276.953)">		<title></title>		<path d="M0 640.87 L796.5 640.87" class="st8"></path>	</g>	<g id="shape11-31" transform="translate(30.5707,-167.916)">		<title></title>		<path d="M0 640.87 L791.34 640.87" class="st8"></path>	</g>	<g id="shape12-34" transform="translate(397.575,-101.453)">		<title></title>		<desc>Adreno GPU</desc>		<rect x="0" y="611.082" width="137.053" height="38.7834" class="st2"></rect>		<text x="34.51" y="634.07" class="st6">Adreno GPU</text>		</g>	<g id="shape13-37" transform="translate(620.322,-101.453)">		<title></title>		<desc>Adreno DPU</desc>		<rect x="0" y="611.082" width="137.053" height="38.7834" class="st2"></rect>		<text x="34.84" y="634.07" class="st6">Adreno DPU</text>		</g>	<g id="shape14-40" transform="translate(767.25,-146.453)">		<title></title>		<desc>Hardware</desc>		<rect x="0" y="627.023" width="68.5264" height="22.8421" class="st9"></rect>		<text x="4" y="642.04" class="st10">Hardware</text>		</g>	<g id="shape15-43" transform="translate(763.974,-261.032)">		<title></title>		<desc>Kernel</desc>		<rect x="0" y="627.023" width="68.5264" height="22.8421" class="st9"></rect>		<text x="4" y="642.04" class="st10">Kernel</text>		</g>	<g id="shape16-46" transform="translate(762.75,-294.61)">		<title></title>		<desc>User space</desc>		<rect x="0" y="627.023" width="80.5" height="22.8421" class="st9"></rect>		<text x="4" y="642.04" class="st10">User space</text>		</g>	<g id="shape17-49" transform="translate(1335.23,78.2727) rotate(90.3585)">		<title></title>		<path d="M0 649.87 L171.54 649.87" class="st11"></path>	</g>	<g id="shape18-55" transform="translate(1338.71,295.713) rotate(90)">		<title></title>		<path d="M0 649.87 L85.6 649.87" class="st11"></path>	</g>	<g id="shape19-60" transform="translate(1338.71,428.394) rotate(90)">		<title></title>		<path d="M0 649.87 L72.94 649.87" class="st11"></path>	</g>	<g id="shape23-65" transform="translate(1115.97,431.626) rotate(90)">		<title></title>		<path d="M0 649.87 L69.71 649.87" class="st11"></path>	</g>	<g id="shape26-70" transform="translate(995.291,74.8406) rotate(90)">		<title></title>		<path d="M0 649.87 L69.18 649.87" class="st11"></path>	</g>	<g id="shape27-75" transform="translate(366.574,-240.268)">		<title></title>		<path d="M0 483.95 L0 649.87 L22.71 649.87" class="st11"></path>	</g>	<g id="shape29-80" transform="translate(171.973,-481.212)">		<title></title>		<path d="M7.93 649.87 L8.29 649.87 L144.44 649.87" class="st13"></path>	</g>	<g id="shape30-88" transform="translate(1114.74,74.2061) rotate(90)">		<title></title>		<path d="M7.93 649.87 L8.29 649.87 L69.81 649.87" class="st13"></path>	</g>	<g id="shape31-95" transform="translate(301.701,-534.564)">		<title></title>		<desc>1. Application calls EGL/OpenGL ES</desc>		<rect x="0" y="623.148" width="102.79" height="26.7175" class="st14"></rect>		<text x="4" y="633.51" class="st15">1. Application calls <tspan x="4" dy="1.2em" class="st7">EGL/OpenGL ES</tspan></text>		</g>	<g id="shape35-99" transform="translate(181.284,-485.138)">		<title></title>		<desc>2. Sets registry and callbacks during rendering</desc>		<rect x="0" y="623.148" width="133.716" height="26.7175" class="st14"></rect>		<text x="4" y="633.51" class="st15">2. Sets registry and <tspan x="4" dy="1.2em" class="st7">callbacks during rendering</tspan></text>		</g>	<g id="shape39-103" transform="translate(191.661,-436.703)">		<title></title>		<desc>3. Gets Wayland backbuffer for rendering</desc>		<rect x="0" y="615.602" width="122.142" height="34.2632" class="st14"></rect>		<text x="4" y="629.73" class="st15">3. Gets Wayland <tspan x="4" dy="1.2em" class="st7">backbuffer for rendering</tspan></text>		</g>	<g id="shape41-107" transform="translate(302.233,-317.453)">		<title></title>		<desc>4. Submits to KGSL using swapbuffer/glflush/glfinish to rende...</desc>		<rect x="0" y="608.188" width="133.716" height="41.6777" class="st14"></rect>		<text x="4" y="620.03" class="st15">4. Submits to KGSL using <tspan x="4" dy="1.2em" class="st7">swapbuffer/glflush/glfinish to </tspan><tspan x="4" dy="1.2em" class="st7">render with OpenGL ES</tspan></text>		</g>	<g id="shape42-112" transform="translate(172.188,-439.811)">		<title></title>		<path d="M7.93 649.87 L8.29 649.87 L144.44 649.87" class="st13"></path>	</g>	<g id="shape43-119" transform="translate(1233.3,74.2061) rotate(90)">		<title></title>		<path d="M7.06 649.87 L7.42 649.87 L70.69 649.87" class="st16"></path>	</g>	<g id="shape44-128" transform="translate(410.875,-515.453)">		<title></title>		<desc>5. EGL/Commit render surface to Wayland</desc>		<rect x="0" y="623.148" width="109.928" height="26.7175" class="st14"></rect>		<text x="4" y="633.51" class="st15">5. EGL/Commit render <tspan x="4" dy="1.2em" class="st7">surface to Wayland</tspan></text>		</g>	<g id="shape45-132" transform="translate(523.375,-537.269)">		<title></title>		<desc>6. Sends rendered surfaces for composition</desc>		<rect x="0" y="626.682" width="122.142" height="23.1839" class="st18"></rect>		<text x="4" y="635.27" class="st15">6. Sends rendered <tspan x="4" dy="1.2em" class="st7">surfaces for composition</tspan></text>		</g>	<g id="shape46-136" transform="translate(172.593,-416.969)">		<title></title>		<path d="M7.93 649.87 L8.29 649.87 L152.16 649.87" class="st19"></path>	</g>	<g id="shape47-141" transform="translate(180,-379.105)">		<title></title>		<desc>7. Gets GBM surface for composing the render frame</desc>		<rect x="0" y="615.602" width="140.54" height="34.2632" class="st20"></rect>		<text x="4" y="629.73" class="st15">7. Gets GBM surface for <tspan x="4" dy="1.2em" class="st7">composing the render frame</tspan></text>		</g>	<g id="shape49-147" transform="translate(1163.87,243.683) rotate(90)">		<title></title>		<path d="M0 649.87 L140.86 649.87" class="st11"></path>	</g>	<g id="shape50-152" transform="translate(449.927,-365.406)">		<title></title>		<desc>8. Submits render frame for composition to GPU</desc>		<rect x="0" y="623.148" width="137.053" height="26.7175" class="st14"></rect>		<text x="4" y="633.51" class="st15">8. Submits render frame for <tspan x="4" dy="1.2em" class="st7">composition to GPU</tspan></text>		</g>	<g id="shape51-156" transform="translate(642.947,-456.299)">		<title></title>		<desc>9. Sends final composed buffer to display DRM</desc>		<rect x="0" y="623.148" width="122.142" height="26.7175" class="st14"></rect>		<text x="4" y="633.51" class="st15">9. Sends final composed <tspan x="4" dy="1.2em" class="st7">buffer to display DRM</tspan></text>		</g>	<g id="shape53-160" transform="translate(643.28,-319.019)">		<title></title>		<desc>10. Submits buffer to display kernel</desc>		<rect x="0" y="626.682" width="110.791" height="23.1839" class="st14"></rect>		<text x="4" y="635.27" class="st15">10. Submits buffer to <tspan x="4" dy="1.2em" class="st7">display kernel</tspan></text>		</g>	<g id="shape64-164" transform="translate(655.056,-35.2304)">		<title></title>		<desc>Qualcomm</desc>		<path d="M8.29 649.87 L74.65 649.87 A8.29428 8.29428 -180 0 0 82.94 641.57 L82.94 636.62 A8.29428 8.29428 -180 0 0 74.65					 628.32 L8.29 628.32 A8.29428 8.29428 -180 0 0 0 636.62 L0 641.57 A8.29428 8.29428 -180 0 0 8.29 649.87 Z" class="st2"></path>		<text x="12.46" y="642.69" class="st6">Qualcomm</text>		</g>	<g id="shape65-167" transform="translate(745.056,-34.8554)">		<title></title>		<desc>Open source</desc>		<path d="M8.29 649.87 L74.65 649.87 A8.29428 8.29428 -180 0 0 82.94 641.57 L82.94 636.62 A8.29428 8.29428 -180 0 0 74.65					 628.32 L8.29 628.32 A8.29428 8.29428 -180 0 0 0 636.62 L0 641.57 A8.29428 8.29428 -180 0 0 8.29 649.87 Z" class="st4"></path>		<text x="7.12" y="642.69" class="st5">Open source</text>		</g></g>
</svg>

**Adreno GPU driver**
The Adreno GPU driver comprises a collection of user-mode precompiled libraries and firmware
                developed by Qualcomm. The Adreno GPU driver must be used as-is. 
Note: To use all the features supported by the Adreno GPU,
                    ensure that the Adreno GPU driver libraries and firmware listed in the following
                    tables are present on the device at
                /lib/firmware/.

**Adreno GPU libraries**

The following table lists the closed-source Adreno graphics libraries supported in the
            user-mode driver:

| Library | Description |
| --- | --- |
| libCB.so | Driver for GPU computing |
| libEGL\_adreno.so | EGL 1.4 driver |
| libeglSubDriverWayland.so | EGL driver for Wayland subsystem |
| libadreno\_utils.so | Utility library for Adreno GPU driver |
| libgsl.so | GSL library |
| libq3dtools\_adreno.so | Adreno profiler support layer |
| libGLESv1\_CM\_adreno.so | OpenGL ES 1.1 driver |
| libGLESv2\_adreno.so | OpenGL ES 2.0/3.0/3.1 driver |
| libq3dtools\_esx.so | OpenGL ES profiler support layer |
| libOpenCL.so | OpenCL library |
| libOpenCL\_adreno.so | OpenCL library for Adreno GPU |
| libllvm-qcom.so | OpenCL compiler library |
| libvulkan\_adreno.so | Vulkan 1.x driver |
| libllvm-glnext.so | OpenGL ES and Vulkan program binary loader |
| libllvm-qgl.so | OpenGL ES and Vulkan core compiler library |

## Adreno GPU firmware

The following table lists the firmware files of the Adreno GPU hardware: 

| Firmware | Description |
| --- | --- |
| a660\_sqe.fw | Microcode for command processor |
| a660\_zap | Secure microcode for secure content support |
| a660\_gmu.bin | Microcode for graphics management unit (GMU) |

## Kernel Graphics Support Layer (KGSL)

The KGSL serves as the kernel-mode driver for the Adreno GPU. Its primary function is
                to submit commands generated by the Adreno user-mode driver to the Adreno GPU for
                processing. Additionally, the KGSL communicates with the graphics management unit
                (GMU) to ensure proper state management. The following table provides details about
                the KGSL driver:

| **Chipset** | QCS6490/QCS5430 |
| --- | --- |
| **Linux kernel version** | 6.6 |
| **Source code path** | &lt;root\_dir&gt;/source/graphics-kernel/ |
| **GPU DTSI filepath** | <ul class="ul" id="graphics-home__ul_jts_lp5_vbc"><br>                                        <li class="li">QCS6490:<ul class="ul" id="graphics-home__ul_dz3_mp5_vbc"><br>                                                <li class="li">&lt;root_dir&gt;/source/graphics-devicetree/gpu/qcm6490-graphics.dtsi</li><br><br>                                                <li class="li">&lt;root_dir&gt;/source/graphics-devicetree/gpu/qcm6490-graphics-pwrlevels.dtsi</li><br><br>                                            </ul><br></li><br><br>                                        <li class="li">QCS5430:<ul class="ul" id="graphics-home__ul_xcr_qp5_vbc"><br>                                                <li class="li">&lt;root_dir&gt;/source/graphics-devicetree/gpu/qcs5430-graphics.dtsi</li><br><br>                                                <li class="li">&lt;root_dir&gt;/source/graphics-devicetree/gpu/qcs5430-graphics-pwrlevels.dtsi</li><br><br>                                            </ul><br></li><br><br>                                    </ul> |

Last Published: Jul 12, 2024

[Next Topic
Getting started](https://docs.qualcomm.com/bundle/publicresource/80-70014-19/topics/graphics-getting-started.md)