NanoGPU : rasterization and shading on FPGA

Occurrences : 

2021

Nombre d'étudiants minimum: 

3

Nombre d'étudiants maximum: 

6

Nombre d'instances : 

1

Domaines: 

Faisable à distance: 

Oui

La technique clef utilisée par tous les GPU modernes pour la 3D, des premières station SGI jusqu’aux récentes RTX3090, est la rasterization qui permet de passer des Primitives (Triangle ou Tri) aux pixels (parfois appelés fragments ).
Le but de ce projet est de réaliser un pipeline de rendu 3D du CPU à l’écran en utilisant le FPGA pour accélérer la rastérisation, proposant une petite API pour afficher des triangles de couleur. Avec un focus sur le rasterizer (et le shading)

 

Il faudra donc réaliser :

  1. une Partie accélération en SystemVerilog qui s’interfacera avec le SoC et qui produira un buffer de couleurs. Le but est ici de réalisé un rasterizer+interpoler (au début pour les couleurs).

  2. Une petite partie qui s’occupera de l’affichage du framebuffer à l’écran (gestion de BACK et du FRONT buffer) => on pourra récupérer un code de gestion du VGA/HDMI pour cette partie (pour n’avoir à faire que la partie changement de buffer)

  3. Une Partie interface/API en C qui servira à lancer le dessin de triangle. En mettant à jour les bons registres. (en se rapprochant des méthodologies de OpenGL 1.0 (sans draw calls complex/drawbuffers)

  4. Une partie démo qui utilisera l’API pour afficher plusieurs triangles (C/C++)

 

Le développement des parties logicielles se fera pour le SoC d’une carte DE1-SoC (ou Xilinx ZynQ, les 2 sont des Arm) en baremetal (sans système d’exploitation).

Le but du projet n’est pas de réaliser un RAMDAC (On utilisera un RAMDAC déjà fait pour VGA ou HDMI)

Le point de départ :

  • Des exemples d’implémentation d’algorithmes de rendu sur CPU (des exemples d’algo de raster et surtout des gestions des coordonnés homogène)
  • -Un certain nombre de cours d’ECE sur le sujet.
  • -Des « hello world » en baremetal et des micros exemples OpenGL (pour avoir une idée de ce qui est attendu comme API)

Poursuite possible (chacune de ces pistes implique des développements dans les 4 parties)

  • un support des textures,
  • un support de petits «fragment shaders»,
  • un support des «vertex» et «geometry shaders»,
  • support du «Z-buffer»,
  • support du «backface culling» et/ou du «Viewing-frustum culling»( before rasterization),
  • implémentation d’autres méthodes de «Visible Surface Determination» (et surtout d’hybrides pour plus de performance),
  • plus de performance (Cache,..)….

Avec beaucoup d’étudiants une architecture unifiée de GPU pourrait être envisagé (b). (Accélération de tout le pipeline avec un seul type d’unité de calcul => petit assembleur MIMO à réaliser)


Un exemple de GPU sur DE1-SOC:

D’autres exemple :