hacking on mesa 3d (fosscomm 2017)
TRANSCRIPT
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