Hacking on Mesa 3D (FOSSCOMM 2017)

26
Hacking on Mesa 3D Eλένη Μαρία Στέα <[email protected]>

Transcript of Hacking on Mesa 3D (FOSSCOMM 2017)

Hacking on Mesa 3DEλένη Μαρία Στέα <[email protected]>

Εισαγωγή στο Mesa 3D/OpenGL

Το πιο διαδεδομένο open source OpenGL/Vulkan implementation

Ελένη Μαρία Στέα Hacking on Mesa 3D 2 / 26

Εισαγωγή στο Mesa 3D/OpenGL

Ιστορικά

▶ Ξεκίνησε ως ένα open source (MIT license) software implemetation του OpenGL

• swrast: software rasterizer

▶ Αργότερα απέκτησε και hardware drivers ως backends

• Intel, AMD Radeon, Nouveau, VMware virtual GPU

▶ Προστέθηκαν και άλλα API/specification implementations

• Vulkan• OpenGL ES1, ES2 & ES3• OpenCL, OpenVG, VDPAU, XVMC, EGL interface

▶ Απέκτησε και άλλους software drivers

• llvmpipe, softpipe

Ελένη Μαρία Στέα Hacking on Mesa 3D 3 / 26

Εισαγωγή στο Mesa 3D/OpenGL

Το mesa 3d είναι ένα πολύ μεγάλο project :-)Εμείς θα εστιάσουμε στο development του:

Ελένη Μαρία Στέα Hacking on Mesa 3D 4 / 26

Εισαγωγή στο Mesa 3D/OpenGL

Το OpenGL μέσα στο Linux Graphics Stack

https://en.wikipedia.org/wiki/Mesa_(computer_graphics)

Indirect Rendering

GLX (OpenGL extension to the X window system)

Direct Rendering

DRI (Direct Rendering Infrastructure)

DRM (Direct Rendering Manager)

Συνδυασμός

GLX + AIGLX (Accelerated Indirect GLX)

Ελένη Μαρία Στέα Hacking on Mesa 3D 5 / 26

Developing the OpenGL

Και τι κάνουμε, λοιπόν, στο OpenGL implementation;

▶ γράφουμε extensions (βλ. fp64, 16-bits κ.α.)▶ προσθέτουμε features στους drivers για να λειτουργούν σωστά τα extensions ή

οι shaders▶ testing και bug fixes▶ release

Αυτά μεταφράζονται σε αλλαγές:

▶ στο mesa core▶ στο glsl compiler▶ στους hardware drivers▶ και όπου αλλού χρειάζεται

Ελένη Μαρία Στέα Hacking on Mesa 3D 6 / 26

Developing the OpenGL

OpenGL Extensions 1/4 : Η ιδέα

▶ Το OpenGL είναι γραμμένο με τρόπο που να μπορεί να επεκτείνεται.

▶ Οποιοσδήποτε κατασκευαστής θελήσει να βάλει κάποιο καινούριο feature πουλείπει από το OpenGL μπορεί να γράψει ένα extension και να το παρέχει.

▶ Στη συνέχεια όποιος το χρειάζεται μπορεί να το φορτώσει μέσω τουμηχανισμού των extensions.

▶ Το Khronos group (που βγάζει το specification) αποφασίζει πριν από κάθεκαινούριο spec ποια extensions είναι τα πιο σημαντικά για να μπουν στο core.

▶ Όλοι όσοι γράφουν κάποιο δικό τους OpenGL (Nvidia, Apple, Intel/Mesa,AMD/Mesa κ.α.) πρέπει για να κάνουν release κάποιo OpenGL version νακάνουν implement τα extensions που μπήκαν στο core αυτού του version.

Ελένη Μαρία Στέα Hacking on Mesa 3D 7 / 26

Developing the OpenGL

OpenGL Extensions 2/4: Τα specifications

OpenGL Registry

git clone https://github.com/KhronosGroup/OpenGL-Registry.git

Extensions Specifications

▶ overview, contributors etc▶ dependencies▶ errors▶ αναλυτικές περιγραφές

Ελένη Μαρία Στέα Hacking on Mesa 3D 8 / 26

Developing the OpenGL

OpenGL Extensions 3/4: Οι αλλαγές

Ένα extension απαιτεί αλλαγές στο API, στους hardware drivers (βλ. i965), στο GLSL compiler και όχι μόνο!

$ ack-grep -i -l ARB_shader_storage_buffer_object mesa

include/GL/glcorearb.hinclude/GL/glext.hsrc/mapi/glapi/registry/gl.xmlsrc/mapi/glapi/gen/Makefile.amsrc/mapi/glapi/gen/gl_API.xmlsrc/mesa/drivers/dri/i965/intel_extensions.csrc/mesa/main/extensions_table.hsrc/mesa/main/context.csrc/mesa/main/mtypes.hsrc/mesa/main/bufferobj.csrc/mesa/main/get.csrc/mesa/main/version.csrc/mesa/main/get_hash_params.pysrc/mesa/main/uniforms.csrc/mesa/state_tracker/st_extensions.csrc/compiler/glsl/glsl_lexer.llsrc/compiler/glsl/ir.hsrc/compiler/glsl/ast_function.cppsrc/compiler/glsl/glsl_parser_extras.cppsrc/compiler/glsl/glsl_parser_extras.hmesa/include/GL/glcorearb.hmesa/include/GL/glext.h

mesa/src/mapi/glapi/registry/gl.xmlmesa/src/mapi/glapi/gen/meson.buildmesa/src/mapi/glapi/gen/Makefile.ammesa/src/mapi/glapi/gen/Makefilemesa/src/mapi/glapi/gen/Makefile.inmesa/src/mapi/glapi/gen/gl_API.xmlmesa/src/mesa/drivers/dri/i965/intel_extensions.cmesa/src/mesa/main/extensions_table.hmesa/src/mesa/main/context.cmesa/src/mesa/main/mtypes.hmesa/src/mesa/main/bufferobj.cmesa/src/mesa/main/get.cmesa/src/mesa/main/version.cmesa/src/mesa/main/get_hash_params.pymesa/src/mesa/main/uniforms.cmesa/src/mesa/state_tracker/st_extensions.cmesa/src/compiler/glsl/glsl_lexer.llmesa/src/compiler/glsl/ir.hmesa/src/compiler/glsl/ast_function.cppmesa/src/compiler/glsl/glsl_parser_extras.cppmesa/src/compiler/glsl/glsl_parser_extras.h

Ελένη Μαρία Στέα Hacking on Mesa 3D 9 / 26

Developing the OpenGL

GLSL/GLSL Compiler

Στο προηγούμενο slide αναφερθήκαμε στoν... GLSL compiler

Τι δουλειά έχει ένας compiler σε ένα API γραφικών;

Ελένη Μαρία Στέα Hacking on Mesa 3D 10 / 26

Developing the OpenGL

Rendering με το OpenGL : πώς χρησιμοποιούμε το API

Όλα τα αντικείμενα στο OpenGLαποτελούνται από primitives

Ελένη Μαρία Στέα Hacking on Mesa 3D 11 / 26

Developing the OpenGL

The OpenGL Pipeline : Fully Programmable με τη χρήση της GLSL!

http://chamilo2.grenet.fr/inp/courses/ENSIMAG4MMG3D/document/instructions/practical_01.html

Ελένη Μαρία Στέα Hacking on Mesa 3D 12 / 26

Developing the OpenGL

GLSL->GLSL IR->NIR->ASM

Από την OpenGL Shading Language στην Assembly

▶ GLSL▶ GLSL IR▶ NIR : SSA (Single Static Assignment) + non SSA▶ Native Code

Ελένη Μαρία Στέα Hacking on Mesa 3D 13 / 26

Developing the OpenGL

GLSL->GLSL IR->NIR->ASM 1/4

Ας πάρουμε ένα απλό OpenGL πρόγραμμα:

GLSL

attribute vec4 vertex;void main(){

gl_Position = vertex;}

GLSL IR

((declare (location=0 shader_out ) vec4 gl_Position)(declare (location=17 shader_in ) vec4 vertex)( function main(signature void(parameters)((assign (xyzw) (var_ref gl_Position) (var_ref vertex) )

))))

Ελένη Μαρία Στέα Hacking on Mesa 3D 14 / 26

Developing the OpenGL

GLSL->GLSL IR->NIR->ASM 2/4

NIR (ssa form)

decl_var shader_in INTERP_MODE_NONE vec4 vertex (VERT_ATTRIB_GENERIC0, 17, 0)decl_var shader_out INTERP_MODE_NONE vec4 gl_Position (VARYING_SLOT_POS, 0, 0)decl_function main returning voidimpl main {

block block_0:/* preds: */vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */)vec4 32 ssa_1 = intrinsic load_input (ssa_0) () (0, 0) /* base=0 */ /* component=0 */intrinsic store_output (ssa_1, ssa_0) () (0, 15, 0) /* base=0 */ /* wrmask=xyzw */

/* component=0 */ /* gl_Position *//* succs: block_0 */block block_0:

}

Ελένη Μαρία Στέα Hacking on Mesa 3D 15 / 26

Developing the OpenGL

GLSL->GLSL IR->NIR->ASM 3/4

NIR (final form)

decl_var shader_in INTERP_MODE_NONE vec4 vertex (VERT_ATTRIB_GENERIC0, 17, 0)decl_var shader_out INTERP_MODE_NONE vec4 gl_Position (VARYING_SLOT_POS, 0, 0)decl_function main returning voidimpl main {

block block_0:/* preds: */vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */)vec4 32 ssa_1 = intrinsic load_input (ssa_0) () (0, 0) /* base=0 */ /* component=0 */intrinsic store_output (ssa_1, ssa_0) () (0, 15, 0) /* base=0 */ /* wrmask=xyzw */

/* component=0 */ /* gl_Position *//* succs: block_0 */block block_0:

}

Ελένη Μαρία Στέα Hacking on Mesa 3D 16 / 26

Developing the OpenGL

GLSL->GLSL IR->NIR->ASM 4/4

Native Code

START B0 (26 cycles)mov(8) g123<1>UD g1<8,8,1>UD { align1 WE_all 1Q compacted };mov(8) g124<1>F g2<8,8,1>F { align1 1Q compacted };mov(8) g125<1>F g3<8,8,1>F { align1 1Q compacted };mov(8) g126<1>F g4<8,8,1>F { align1 1Q compacted };mov(8) g127<1>F g5<8,8,1>F { align1 1Q compacted };send(8) null<1>F g123<8,8,1>F

urb 1 SIMD8 write mlen 5 rlen 0 { align1 1Q EOT };nop ;

END B0

Ελένη Μαρία Στέα Hacking on Mesa 3D 17 / 26

Debugging Tools

GLSL->GLSL IR->NIR->ASM Debugging

Μπορούμε να ελέγξουμε τα ενδιάμεσα representationsχρησιμοποιώντας τα environment variables του Mesa για τους drivers

$ export INTEL_DEBUG=vs$ export INTEL_DEBUG=fs$ export INTEL_DEBUG=vs,fs, ...

Όπως στο επόμενο παράδειγμα ;-)

Ελένη Μαρία Στέα Hacking on Mesa 3D 18 / 26

Debugging Tools

OpenGL Extensions 4/4: Testing & Debugging

Επειδή αναφερθήκαμε στο Debugging...

Υπάρχει μια διαδικασία με την οποία ελέγχουμε τα implementations των OpenGL extensions

▶ Για κάθε καινούριο feature που μπαίνει σε κάποιο OpenGL version γράφεται και ένα testαπό τα μέλη του Khronos Group.

▶ Είναι operations που γίνονται με shaders και με software και έχουν ως outputs εικόνεςπου μπορούμε να συγκρίνουμε μεταξύ τους.

▶ VK-GL-CTS: https://github.com/KhronosGroup/VK-GL-CTS

▶ Κάθε κατασκευαστής, τα χρησιμοποιεί στο δικό του implementation ώστε όταν τοversion γίνει release να περνάνε όλα.

▶ Όταν ένα test αποτυγχάνει και το bug δεν είναι στο test ξέρουμε ότι κατά πάσαπιθανότητα ο driver μας έχει πρόβλημα.

▶ Ελέγχουμε επίσης για πιθανά regressions από version σε version ή για περιπτώσεις όπουένα feature σπάει κάποιο άλλο (τεστ που περνούσαν αποτυγχάνουν).

Ελένη Μαρία Στέα Hacking on Mesa 3D 19 / 26

Debugging Tools

Other Debugging Tools

Μερικά χρήσιμα εργαλεία για όταν εντοπίζονται προβλήματα

▶ GDB

▶ MESA environment variables: https://www.mesa3d.org/envvars.html

• Μπορούμε να κάνουμε dump/replace πληροφορία (asm, IR, GLSL code)

• Μπορούμε να αλλάζουμε τα GL versions

• Μπορούμε να τεστάρουμε συγκεκριμένα code paths Μπορούμε να τεστάρουμεσυγκεκριμένα operations του κάθε driver

• just check the website :)

▶ περιβάλλοντα στα οποία μπορούμε άφοβα να πειραματιστούμε: chroot, jhbuild shell

Ελένη Μαρία Στέα Hacking on Mesa 3D 20 / 26

Debugging Tools

Debug στο mesa, στα open source graphics apps, debug παντού!

Debug στα πάντα!!

Με τα εργαλεία που μας παρέχει το Mesa μπορούμε να κάνουμε debug:▶ στο ίδιο τοmesa▶ σε άλλα open source graphics applications▶ αλλά ακόμη και σε proprietary software!

Ελένη Μαρία Στέα Hacking on Mesa 3D 21 / 26

Debugging Tools

Αντικατάσταση κώδικα στους shaders

Limbo Showcase:

Ανεξάρτητα από το αν έχουμε το source ενός προγράμματος,μπορούμε να τεστάρουμε αλλά και να αλλάξουμε τους shaders του

όσο αυτό τρέχει.

▶ $ export MESA_SHADER_DUMP_PATH=‘pwd‘/dump_sdr/

▶ $ export MESA_SHADER_READ_PATH=‘pwd‘/read_sdr/

Ελένη Μαρία Στέα Hacking on Mesa 3D 22 / 26

Contributions

Πώς μπορεί κάποιος να αναμειχθεί;

Κώδικας

▶ Mesa Repositories:https://cgit.freedesktop.org/mesa/

▶ Issue Tracking:https://www.mesa3d.org/bugs.html

▶ Debugging Tools:https://www.mesa3d.org/envvars.html

▶ Patches! (η διαδικασία):https://www.mesa3d.org/submittingpatches.html

▶ Khronos CTS Repositories και Issue Tracker:https://github.com/KhronosGroup/VK-GL-CTS

Ελένη Μαρία Στέα Hacking on Mesa 3D 23 / 26

Contributions

Χρήσιμα links

1 The mesa 3d graphics library (Documentation/Tools):https://www.mesa3d.org/

2 Khronos OpenGL registry:https://www.khronos.org/registry/OpenGL/index_gl.php

3 Intel microarchitectures:https://en.wikichip.org/wiki/intel/microarchitectures

4 Intel PRMs:https://01.org/linuxgraphics/documentation/hardware-specification-prms

5 Iago Toral’s introduction on mesa:https://blogs.igalia.com/itoral/category/graphics/

6 Jasper St. Pierre’s blog post on Linux graphics stack:http://blog.mecheye.net/2012/06/the-linux-graphics-stack/

7 Stéphane Marchesin’s book on Linux graphics drivers:https://people.freedesktop.org/~marcheu/linuxgraphicsdrivers.pdf

8 Samuel Iglesias’s posts on Piglit:https://blogs.igalia.com/siglesias/

9 Alejandro Piñeiro’s posts on Mesa/Intel driver development we do at Igalia:https://blogs.igalia.com/apinheiro/

10 Ben Widawsky’s post on GEN graphics and the URB:https://bwidawsk.net/blog/index.php/2015/09/gen-graphics-and-the-urb

Ελένη Μαρία Στέα Hacking on Mesa 3D 24 / 26

The End...

[email protected]://eleni.mutantstargoat.com/hikiko

Ελένη Μαρία Στέα Hacking on Mesa 3D 25 / 26

The End...

Ευχαριστώ πολύ!

Ελένη Μαρία Στέα Hacking on Mesa 3D 26 / 26