Hacking on 3D Eλένη Μαρία Στέα Εισαγωγή στο 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

Indirect Rendering

GLX (OpenGL extension to the )

Direct Rendering

DRI (Direct Rendering Infrastructure)

DRM ()

Συνδυασμός

https://en.wikipedia.org/wiki/Mesa_(computer_graphics) 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.h mesa/src/mapi/glapi/registry/gl.xml include/GL/glext.h mesa/src/mapi/glapi/gen/meson.build src/mapi/glapi/registry/gl.xml mesa/src/mapi/glapi/gen/Makefile.am src/mapi/glapi/gen/Makefile.am src/mapi/glapi/gen/gl_API.xml mesa/src/mapi/glapi/gen/Makefile src/mesa/drivers/dri/i965/intel_extensions.c mesa/src/mapi/glapi/gen/Makefile.in src/mesa/main/extensions_table.h mesa/src/mapi/glapi/gen/gl_API.xml src/mesa/main/context.c mesa/src/mesa/drivers/dri/i965/intel_extensions.c src/mesa/main/mtypes.h mesa/src/mesa/main/extensions_table.h mesa/src/mesa/main/context.c src/mesa/main/bufferobj.c mesa/src/mesa/main/mtypes.h src/mesa/main/get.c src/mesa/main/version.c mesa/src/mesa/main/bufferobj.c src/mesa/main/get_hash_params.py mesa/src/mesa/main/get.c src/mesa/main/uniforms.c mesa/src/mesa/main/version.c mesa/src/mesa/main/get_hash_params.py src/mesa/state_tracker/st_extensions.c src/compiler/glsl/glsl_lexer.ll mesa/src/mesa/main/uniforms.c src/compiler/glsl/ir.h mesa/src/mesa/state_tracker/st_extensions.c mesa/src/compiler/glsl/glsl_lexer.ll src/compiler/glsl/ast_function.cpp mesa/src/compiler/glsl/ir.h src/compiler/glsl/glsl_parser_extras.cpp src/compiler/glsl/glsl_parser_extras.h mesa/src/compiler/glsl/ast_function.cpp mesa/include/GL/glcorearb.h mesa/src/compiler/glsl/glsl_parser_extras.cpp mesa/include/GL/glext.h mesa/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 void impl 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 void impl 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] http://eleni.mutantstargoat.com/hikiko

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

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

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