# Getting started

The following workflow shows how to get started with a graphics application on a Qualcomm device.

<?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 getting-started-graphics.svg Page-1 -->
<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" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="15.5833in" height="2.50694in" viewbox="0 0 1122 180.5" xml:space="preserve" color-interpolation-filters="sRGB" class="st8"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2.5 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2.5 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 1.16666em }
.svg-1 .st4 { fill: #000000; font-family: Arial; font-size: 1.00001em }
.svg-1 .st5 { font-size: 1em }
.svg-1 .st6 { marker-end: url("#mrkr5-36"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2.5 }
.svg-1 .st7 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.49800796812749 }
.svg-1 .st8 { 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-36" class="st7" v:arrowtype="5" v:arrowsize="2" v:setback="3.514" refx="-3.514" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend5" transform="scale(-2.008,-2.008) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="0.0138889" v:pagescale="0.0138889" v:drawingunits="29" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1009-1" v:mid="1009" v:groupcontext="shape" transform="translate(19.25,-19.25)">		<title></title>		<rect x="0" y="38.5" width="1083.5" height="142" class="st1"></rect>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" transform="translate(248.125,-40.4969)">		<title></title>		<desc>Run sample applications</desc>		<v:textblock v:margins="rect(4,4,4,4)" v:verticalalign="0"></v:textblock>		<v:textrect cx="195.75" cy="129.748" width="391.5" height="101.503"></v:textrect>		<rect x="0" y="78.9969" width="391.5" height="101.503" rx="9" ry="9" class="st2"></rect>		<text x="122.99" y="112.4" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist><v:lf></v:lf>Run sample applications</text>		</g>	<g id="shape7-6" v:mid="7" v:groupcontext="shape" transform="translate(394.187,-47.5)">		<title></title>		<desc>OpenCL sample application</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.7171" cy="154.946" width="111.44" height="51.1072"></v:textrect>		<rect x="0" y="129.393" width="111.434" height="51.1072" rx="9" ry="9" class="st2"></rect>		<text x="12.36" y="151.35" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>OpenCL sample <tspan x="27.03" dy="1.2em" class="st5">application</tspan></text>		</g>	<g id="shape8-10" v:mid="8" v:groupcontext="shape" transform="translate(260.286,-47.5)">		<title></title>		<desc>OpenGL ES sample application</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="62.089" cy="154.946" width="124.18" height="51.1072"></v:textrect>		<rect x="0" y="129.393" width="124.178" height="51.1072" rx="9" ry="9" class="st2"></rect>		<text x="8.73" y="151.35" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>OpenGL ES sample <tspan x="33.4" dy="1.2em" class="st5">application</tspan></text>		</g>	<g id="shape10-14" v:mid="10" v:groupcontext="shape" transform="translate(515.875,-47.5)">		<title></title>		<desc>Vulkan sample application</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.7171" cy="153.38" width="111.44" height="54.2409"></v:textrect>		<rect x="0" y="126.259" width="111.434" height="54.2409" rx="9" ry="9" class="st2"></rect>		<text x="16.36" y="149.78" class="st4" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Vulkan sample <tspan x="27.03" dy="1.2em" class="st5">application</tspan></text>		</g>	<g id="shape1016-18" v:mid="1016" v:groupcontext="shape" transform="translate(29.875,-40.4969)">		<title></title>		<desc>Generate Platform eSDK</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.1985" cy="129.748" width="160.4" height="101.503"></v:textrect>		<rect x="0" y="78.9969" width="160.397" height="101.503" rx="9" ry="9" class="st2"></rect>		<text x="23.01" y="123.15" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Generate Platform <tspan x="61.91" dy="1.457em" class="st5">eSDK</tspan></text>		</g>	<g id="shape1017-22" v:mid="1017" v:groupcontext="shape" transform="translate(697.978,-41.7484)">		<title></title>		<desc>Debug sample applications</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.1985" cy="129.748" width="160.4" height="101.503"></v:textrect>		<rect x="0" y="78.9969" width="160.397" height="101.503" rx="9" ry="9" class="st2"></rect>		<text x="35.06" y="123.15" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Debug sample <v:lf></v:lf><tspan x="46.73" dy="1.457em" class="st5">applications</tspan></text>		</g>	<g id="shape1018-26" v:mid="1018" v:groupcontext="shape" transform="translate(912.375,-41.7484)">		<title></title>		<desc>Run the Snapdragon Profiler tool for profiling sample applica...</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="89.9375" cy="129.748" width="179.88" height="101.503"></v:textrect>		<rect x="0" y="78.9969" width="179.875" height="101.503" rx="9" ry="9" class="st2"></rect>		<text x="25.33" y="114.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Run the Snapdragon  <tspan x="17.96" dy="1.2em" class="st5">Profiler tool for profiling </tspan><tspan x="28.46" dy="1.457em" class="st5">sample applications</tspan></text>		</g>	<g id="shape1022-31" v:mid="1022" v:groupcontext="shape" v:layermember="0" transform="translate(190.272,-82.2484)">		<title></title>		<path d="M0 171.5 L49.07 171.5" class="st6"></path>	</g>	<g id="shape1024-37" v:mid="1024" v:groupcontext="shape" v:layermember="0" transform="translate(639.625,-82.8742)">		<title></title>		<path d="M0 171.5 L49.57 171.5" class="st6"></path>	</g>	<g id="shape1025-42" v:mid="1025" v:groupcontext="shape" v:layermember="0" transform="translate(858.375,-83.5)">		<title></title>		<path d="M0 171.5 L45.21 171.5" class="st6"></path>	</g></g>
</svg>

**Figure : Workflow of graphics applications**

## OpenGL ES-based applications

`glmark2` is an OpenGL ES-based sample application provided in the Platform eSDK.

**Prerequisites**

- Install the Platform eSDK using either of the following methods:

    - [Using Qualcomm release archive](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-51/install-sdk.html#download-qim-platform-esdk)
    - [Manually compile the Qualcomm Linux SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#generate-an-esdk)
- Establish an SSH connection from the Linux host to the device. For instructions, see [Use SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#use-ssh).
- Ensure that the Weston application is running. If not, start the Weston application by running the following commands:

> 
> 
> . /etc/profile
>         Copy to clipboard
> 
> 
> export XDG_RUNTIME_DIR=/dev/socket/weston
>         Copy to clipboard
> 
> 
> mkdir --parents $XDG_RUNTIME_DIR
>         Copy to clipboard
> 
> 
> chmod 0700 $XDG_RUNTIME_DIR
>         Copy to clipboard
> 
> 
> cd /usr/bin/
>         Copy to clipboard
> 
> 
> killall weston
>         Copy to clipboard
> 
> 
> ./weston --tty=2 --continue-without-input
>         Copy to clipboard
> 
> 
> For more information on the Weston application, see [Qualcomm Linux Display Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-18).

For information on the OpenGL ES extensions supported on Qualcomm Linux devices, see [EGL extensions](https://docs.qualcomm.com/doc/80-70017-19/topic/supported_extensions.html#supported-egl-client-extensions).

**Compile and run glmark2 application**

1. To set the SDK environment on the Linux host, run the following command:

source environment-setup-armv8-2a-qcom-linux
        Copy to clipboard
2. To compile and generate a binary, run the following commands:

devtool modify glmark2
        Copy to clipboard

devtool build glmark2
        Copy to clipboard

    If you encounter any umask error, set the umask to 022.

    After successful compilation, the output files are generated in the `<path-to-installed-eSDK>/workspace/sources/glmark2/oe-workdir/image/usr/bin` directory.
3. To push the binary to the device, run the following commands:

scp -r <path-to-installed-Platform-eSDK>/workspace/sources/glmark2/oe-workdir/image/usr/bin/glmark2-es2-wayland root@[IP-address-of-device]:/tmp
        Copy to clipboard

scp -r <path-to-installed-Platform-eSDK>/workspace/sources/glmark2/oe-workdir/image/usr/share/glmark2 root@[IP-address-of-device]:/tmp
        Copy to clipboard
4. To run the application on the device, open the SSH terminal using the IP address of the device and run the following commands:

export XDG_RUNTIME_DIR=/dev/socket/weston export WAYLAND_DISPLAY=wayland-1
        Copy to clipboard

chmod 777 /tmp/glmark2-es2-wayland
        Copy to clipboard

chmod -R 777 /tmp/glmark2
        Copy to clipboard

cd /tmp
        Copy to clipboard

./glmark2-es2-wayland --data-path /tmp/glmark2 -b jellyfish
        Copy to clipboard

Note

To run the sample application from the UART shell, remount the file system using the following command:

mount -o remount,rw /
        Copy to clipboard

## OpenCL-based applications

Multiple sample applications are provided in the Adreno OpenCL SDK. The steps to compile and run any sample application are the same.

Note

Currently, Qualcomm Linux supports OpenCL v2.1.

**Prerequisites**

- Install the Platform eSDK using either of the following methods:

    - [Using Qualcomm release archive](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-51/install-sdk.html#download-qim-platform-esdk)
    - [Manually compile the Qualcomm Linux SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#generate-an-esdk)
- Establish an SSH connection from the Linux host to the device. For instructions, see [Use SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#use-ssh).
- Download the [Adreno OpenCL SDK](https://softwarecenter.qualcomm.com/#/catalog/item/Adreno_OpenCL_SDK).

Note

You must be a registered user to download the Adreno OpenCL SDK.

For information on the OpenCL extensions supported on Qualcomm Linux devices, see [OpenCL extensions](https://docs.qualcomm.com/doc/80-70017-19/topic/supported_extensions.html#supported-opencl-extensions).

**Compile and run the hello world sample application**

1. To compile the application, run the following commands on the Linux host:

cd opencl-sdk
        Copy to clipboard

source <path-to-installed-Platform-eSDK>/environment-setup-armv8-2a-qcom-linux
        Copy to clipboard

cmake -B build -DCLSDK_OPENCL_LIBRARY=$OECORE_TARGET_SYSROOT/usr/lib/libOpenCL.so -DCLSDK_DMABUFHEAP_LIBRARY=$OECORE_TARGET_SYSROOT/usr/lib/libdmabufheap.so -DOPEN_EMBEDDED=1
        Copy to clipboard

cmake --build build
        Copy to clipboard

    After successful compilation, binary files are generated in the `/build` directory.
2. To run the application, open the SSH terminal using the IP address of the device and run the following commands:

mkdir -p /opt/data
        Copy to clipboard

mkdir -p /opt/data/opencl
        Copy to clipboard

Note

If you want to run a sample application from the UART shell, remount the file system using the following command:

mount -o remount,rw /
        Copy to clipboard
3. To push the binary to the device, run the following commands:

scp -r <opencl-sdk>/build/* root@[IP-address-of-the device]:/opt/data/opencl/
        Copy to clipboard

scp -r <opencl-sdk>/example_images/* root@[IP-address-of-the device]:/opt/data/opencl/
        Copy to clipboard
4. To start the application, run the following commands on the device using the SSH terminal:

cd /opt/data/opencl/
        Copy to clipboard

mkdir out
        Copy to clipboard

chmod 777 ./*
        Copy to clipboard

echo "run hello world 2.0 opencl sdk" > hello_world_input.txt
        Copy to clipboard

touch out/hello_world_output.txt
        Copy to clipboard

cat out/hello_world_output.txt
        Copy to clipboard

./cl_sdk_hello_world hello_world_input.txt out/hello_world_output.txt
        Copy to clipboard

cat out/hello_world_output.txt
        Copy to clipboard

## Vulkan-based applications

Multiple sample applications are provided in the Adreno SDK for Vulkan. The steps to compile and run any sample application are the same. As an example, the steps to run a Sascha Willems and Khronos Vulkan sample applications are described here.

**Prerequisites**

- Install the Platform eSDK using either of the following methods:

    - [Using Qualcomm release archive](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-51/install-sdk.html#download-qim-platform-esdk)
    - [Manually compile the Qualcomm Linux SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#generate-an-esdk)
- Establish an SSH connection from the Linux host to the device. For instructions, see [Use SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#use-ssh).

For information on the Vulkan extensions supported on Qualcomm Linux devices, see [Vulkan extensions](https://docs.qualcomm.com/doc/80-70017-19/topic/supported_extensions.html#supported-vulkan-extensions).

### Sascha Willems Vulkan-based applications

The Sascha Willems Vulkan sample applications are available at [https://github.com/SaschaWillems/Vulkan.git](https://github.com/SaschaWillems/Vulkan.git). The steps to compile and run any Sascha Willems Vulkan application are the same.

**Compile and run the triangle bin sample application**

1. To compile the application, run the following commands on the Linux host:

git clone --recurse-submodules https://github.com/SaschaWillems/Vulkan.git
        Copy to clipboard

cd Vulkan
        Copy to clipboard

source <path-to-installed-Platform-eSDK>/environment-setup-armv8-2a-qcom-linux
        Copy to clipboard

cmake -G "Unix Makefiles" -Bbuild/linux -DUSE_WAYLAND_WSI=ON -DRESOURCE_INSTALL_DIR="/tmp/"
        Copy to clipboard

cmake --build build/linux --config Release  -j$(nproc)
        Copy to clipboard

    After successful compilation, binary files are generated in the `build/linux/bin` directory.
2. To push the binary to the device, run the following commands:

cd Vulkan
        Copy to clipboard

scp -r assets root@[IP-address-of-device]:/tmp/
        Copy to clipboard

scp -r shaders root@[IP-address-of-device]:/tmp/
        Copy to clipboard

scp -r build/linux/bin/triangle root@[IP-address-of-device]:/tmp/
        Copy to clipboard
3. To run the application, open the SSH terminal using the IP address of the device and run the following commands:

cd /tmp
        Copy to clipboard

chmod -R 777 assets/
        Copy to clipboard

chmod -R 777 shaders/
        Copy to clipboard

chmod 777 triangle
        Copy to clipboard

export XDG_RUNTIME_DIR=/dev/socket/weston export WAYLAND_DISPLAY=wayland-1
        Copy to clipboard

./triangle
        Copy to clipboard

### Khronos Vulkan-based applications

The Khronos Vulkan sample applications are available at [https://github.com/KhronosGroup/Vulkan-Samples.git](https://github.com/KhronosGroup/Vulkan-Samples.git). The steps to compile and run any Khronos Vulkan application are the same.

**Compile and run the vulkan\_samples application**

1. To compile the application, run the following commands on the Linux host:

sudo apt-get install -y libwayland-dev
        Copy to clipboard

git clone --recurse-submodules https://github.com/KhronosGroup/Vulkan-Samples.git
        Copy to clipboard

cd Vulkan-Samples/
        Copy to clipboard

source <path-to-installed-Platform-eSDK>/environment-setup-armv8-2a-qcom-linux
        Copy to clipboard

cmake -G "Unix Makefiles" -Bbuild/linux -DCMAKE_BUILD_TYPE=Release -DVKB_WSI_SELECTION=WAYLAND -DGLFW_BUILD_X11=OFF
        Copy to clipboard

    If the compilation fails, do the following:

    1. Open the `Vulkan-Samples/build/linux/CmakeCache.txt` file.
    2. Change `GLFW_BUILD_X11` to `OFF`.
2. To generate the binary files, run the following command:

cmake --build build/linux --config Release --target vulkan_samples -j$(nproc)
        Copy to clipboard

    After successful compilation, the binary files are generated in the `Vulkan-Samples/build/linux/app/bin/Release/aarch64` directory.
3. To push the binary to the device, run the following commands:

cd Vulkan-Samples
        Copy to clipboard

scp -r assets root@[IP-address-of-device]:/tmp/
        Copy to clipboard

scp -r shaders root@[IP-address-of-device]:/tmp/
        Copy to clipboard

scp -r build/linux/app/bin/Release/aarch64/vulkan_samples root@[IP-address-of-device]:/tmp/
        Copy to clipboard
4. To run the application, open the SSH terminal using the IP address of the device and run the following commands:

cd /tmp
        Copy to clipboard

chmod -R 777 assets/
        Copy to clipboard

chmod -R 777 shaders/
        Copy to clipboard

chmod 777 vulkan_samples
        Copy to clipboard

export XDG_RUNTIME_DIR=/dev/socket/weston export WAYLAND_DISPLAY=wayland-1
        Copy to clipboard

./vulkan_samples sample swapchain_images
        Copy to clipboard

Note

If you are unable to run these sample applications from the `/tmp` directory due to storage issues, try alternative directories such as `/etc`.

Last Published: Dec 27, 2024

[Previous Topic
Overview](https://docs.qualcomm.com/bundle/publicresource/80-70017-19/topics/graphics-overview.md) [Next Topic
Tools](https://docs.qualcomm.com/bundle/publicresource/80-70017-19/topics/graphics_developer_tools.md)