android high performance in gpu using opengles and renderscript
TRANSCRIPT
![Page 1: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/1.jpg)
Limitless Arvind Devaraj
High Performance Graphics and Compute
OpenGLES and RenderScript
Arvind Devaraj
![Page 2: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/2.jpg)
Limitless Arvind Devaraj
slideshare.net/darvind/
![Page 3: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/3.jpg)
Limitless Arvind Devaraj
Agenda
● Introduction : Graphics terms
● Graphics on GPU
● OpenGL Android Graphics
● Graphics Pipeline
● Shaders
● High Performance Compute on GPU
● RenderScript
![Page 4: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/4.jpg)
Limitless Arvind Devaraj
CPU versus GPU
● CPU
– good at executing sequential code
– Handles branches well
● GPU
– Same code, multiple data
– Parallelism (ideal for image rendering)
![Page 5: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/5.jpg)
Limitless Arvind Devaraj
Graphics Terms
● OpenGLES : Graphics API for doing 3D operations on GPU / CPU
● Primitives : lines, point, triangles
● Texture : make the image realistic by adding bitmap
![Page 6: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/6.jpg)
Limitless Arvind Devaraj
Graphics on GPU
Wireframe of modelPolygonated
![Page 7: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/7.jpg)
Limitless Arvind Devaraj
Graphics Pipeline
VertexTransformation
Pixel operationsVertex
Rasterize the triangle to pixels
![Page 8: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/8.jpg)
Limitless Arvind Devaraj
OpenGL Driver
Converts API call to commands – glDraw()
Commands executed in GPU / CPU
Implementation of the Graphics Pipeline
![Page 9: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/9.jpg)
Limitless Arvind Devaraj
OpenGLES Android Graphics
● Graphics Library for 3D
![Page 10: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/10.jpg)
Limitless Arvind Devaraj
Android Graphics Classes
GLSurfaceViewGLSurfaceView.Renderer
➢ View - connects SurfaceView to OpenGLES library
➢ Renderer - responsible for rendering a frame
![Page 11: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/11.jpg)
Limitless Arvind Devaraj
GLSurfaceView
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new SquareRenderer());
![Page 12: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/12.jpg)
Limitless Arvind Devaraj
GLSurfaceView.Renderer
public class SquareRenderer implements GLSurfaceView.Renderer {
public void onSurfaceCreated(GL10 unused, EGLConfig config) { } public void onDrawFrame(GL10 unused) {
} public void onSurfaceChanged(GL10 unused, int width, int height) {
}}
When surface is changed (rotated etc)
draw() - Code for drawing the frame ( Square )
Code when surface is created
![Page 13: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/13.jpg)
Limitless Arvind Devaraj
GLSurfaceView.Renderer
● The renderer is responsible for making OpenGL calls to render a frame.
– onDrawFrame() responsible for drawing the current frame
– OnSurfaceChanged() called when surface size changes
– OnSurfaceCreated() called when surface is created
![Page 14: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/14.jpg)
Limitless Arvind Devaraj
draw() {
float coords[] = { .... };
vertex 'buffer' created with the coords
glVertexPointer(buffer) :
glDrawArrays(TRIANGLE_STRIP, ...);}
Drawing a Square
![Page 15: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/15.jpg)
Limitless Arvind Devaraj
draw() {
float squareCoords[] = { .... };
ByteBuffer vbb = ....
squareVB = vbb.asFloatBuffer(); squareVB.put(squareCoords);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);}
Full code:https://github.com/arvind-devaraj/android-opengles/blob/master/3_SquareRenderer/src/com/example/graphics1/Square.java
Drawing a Square
![Page 16: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/16.jpg)
Limitless Arvind Devaraj
draw() {
float squareCoords[] = { .... };
ByteBuffer vbb = ....
squareVB = vbb.asFloatBuffer(); squareVB.put(squareCoords);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);}
Full code:https://github.com/arvind-devaraj/android-opengles/blob/master/3_SquareRenderer/src/com/example/graphics1/Square.java
Drawing a Square
![Page 17: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/17.jpg)
Limitless Arvind Devaraj
OpenGL Rendering Pipeline
![Page 18: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/18.jpg)
Limitless Arvind Devaraj
Shaders
● Shaders are programs that execute on the GPU
● Shader programs operate on
– Each vertex
– Each pixel
![Page 19: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/19.jpg)
Limitless Arvind Devaraj
Shader Programs
• Vertex Shader – operates on each vertex
• Fragment Shader – operates on each pixel
• Shaders are compiled and linked ( like any program )
• Executable is sent to the GPU
![Page 20: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/20.jpg)
Limitless Arvind Devaraj
![Page 21: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/21.jpg)
Limitless Arvind Devaraj
Vertex Shader
Fragment Shader
attribute vec4 vertexPosition;void main(){ gl_Position = vertexPosition * 2;
}
precision mediump float;void main(){ gl_FragColor = ( color.r + color.g + color.b ) / 3;}
![Page 22: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/22.jpg)
Limitless Arvind Devaraj
Program running on GPU/CPU
![Page 23: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/23.jpg)
Limitless Arvind Devaraj
CPU – GPU communication
![Page 24: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/24.jpg)
Limitless Arvind Devaraj
GPU for General Programs
● Graphics is accelerated by the GPU
● Can GPU accelerate other programs ?
– e.g. Matrix multiply, encryption
● OpenCL, CUDA, Renderscript are API
– used for general purpose GPU
![Page 25: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/25.jpg)
Limitless Arvind Devaraj
RenderScript
● A high level API to access GPU● Provides high performance Compute● Provides uniform API across multiple SoC● Alternative is NDK (but NDK is platform
specific)
![Page 26: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/26.jpg)
Limitless Arvind Devaraj
RenderScript – Use cases
● What functions can be accelerated
– Graphics
– Image Processing
– Encryption
– Signal processing
– Mathematical functions
![Page 27: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/27.jpg)
Limitless Arvind Devaraj
RenderScript - Flow
![Page 28: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/28.jpg)
Limitless Arvind Devaraj
RenderScript – CPU side
Class Hello extends Activity {
Allocation input, output;
Create a script (kernel) that specifies the function
Run script for each element in allocation }
Allocation is how you get data to RS, so that it is processed by kernel
![Page 29: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/29.jpg)
Limitless Arvind Devaraj
RenderScript – CPU side
Class Hello extends Activity {
Allocation input; Allocation output;
RenderScript rs = new RenderScript() ScriptC_func script = new ScriptC_func(...)
script.forEach_root(input, output) }
Allocation is how you get data to RS, so that it is processed by kernel
![Page 30: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/30.jpg)
Limitless Arvind Devaraj
Renderscript Java interaction
![Page 31: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/31.jpg)
Limitless Arvind Devaraj
RenderScript – GPU side
func.rs
void root (char *in , char *out) { *out = *in * 2
}
Renderscript code is compiled to device independent Bitcode
Bitcode is dynamically interpreted by runtime for specifi GPU
![Page 32: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/32.jpg)
Limitless Arvind Devaraj
RenderScript
● Advantages : Compared to NDK, provides an easy device agnostic way to accelerate performance on GPU
● Disadvantages : C99 standard, debugging is restricted
![Page 33: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/33.jpg)
Limitless Arvind Devaraj
Renderscipt - Summary
● Renderscript is an API to access GPU
● Used for High Performance
● High Performance Compute / Graphics
● Compute, Math , FFT, convolution, Signal processing
● Support Graphics – but not a replacement for OpenGL
● Works on all GPUs ( if supported by SoC ) otherwise on CPU
![Page 34: Android High performance in GPU using opengles and renderscript](https://reader033.vdocuments.mx/reader033/viewer/2022052321/554f7ac8b4c9052a518b4a2d/html5/thumbnails/34.jpg)
Limitless Arvind Devaraj
Renderscript potential
Limitless
arvinddevaraj
github, linkedin,twitter