Gigi: Rapid Prototyping Platform for Real-Time Rendering
Gigi is a rapid prototyping platform for real-time rendering developed by SEED's future graphics group. We are pleased to announce that it is now open-sourced on GitHub at: https://github.com/electronicarts/gigi
You can view the full Intro to Gigi tutorial above.
Gigi allows you to create rendering techniques as a node graph in a visual editor, iterate on them in the viewer, and generate code for them with the compiler. Gigi is intended for professionals, researchers, students, and hobbyists.
The editor allows you to describe a rendering technique in a node graph system, where you can specify actions (orange nodes) such as compute shader dispatches, resource copies, and draw calls. Each action node indicates read or write access to buffer and texture resource nodes (blue nodes) through input and output pins. You provide shader source code for shader nodes.
The viewer lets you view and debug your technique in real time. It supports inspecting resources at each step, allowing pausing and single-step execution, and supporting hot reloading to speed up iteration time. A built-in profiler gives CPU and GPU timings for your technique to help you understand performance characteristics. A Python scripting interface allows you to automate complex or tedious tasks, such as running tests or gathering data for graphs or images for diagrams. For more advanced analysis needs, you can click a button to open a pix capture that has been annotated with pix markers for each node.
The compiler is responsible for generating code for your technique. The code is meant to look like a human wrote it, with comments and friendly variable names, and is intended to pass a code review. The public version of Gigi supports only C++/DX12 code generation, but we plan on adding more platforms as time goes on. Internally, we have code generation support for Frostbite, UE5, and the SEED research engine Halcyon, proving Gigi’s ability to target various platforms. There is also an extensive list of features we’d like to implement or make available in this public version of Gigi, including adding code generation for WebGPU, Vulkan, and perhaps other popular engines.
Development Philosophy
Graphics programming has become more complex than ever, but it doesn’t have to be that way. It only takes about five minutes to give a person a set of shaders, tell them the order to run them in, and what the inputs and outputs are. But implementing that within any given API or engine takes a much longer amount of time. Shaders tend to port pretty well, so most of the porting effort goes into writing the CPU operations for dispatching shaders, shuttling shader constants into buffers, resource lifetime management – and the compile times needed to verify each step is working and debug it if it isn’t. The details of how to do these CPU side operations vary from target to target, but for any specific target, there is little ambiguity about what to do; It’s just very mechanical and tedious.
The process is so mechanical that a computer program could do it, and Gigi is that computer program.
Code-level abstraction can't solve the needs of every platform or the wishes of every development team. This is why Gigi is a code generator instead of a library. When idiomatic code is delivered that is written like a human would write it, the only relevant discussions are about the technique's functionality, not how it was developed. Code generation also allows Gigi to work outside of a single programming language and can generate code for C++, Javascript, Rust, and others, as needed.
Gigi Use Within and Outside of Electronic Arts
Gigi is used within Electronic Arts for collaboration between teams, sharing prototypes, generating data and figures for published research, and generating code to share publicly. It’s also used as a learning tool, allowing people to explore or evaluate new technologies without the pain of working against a raw API or the overhead of a large engine. When thoughts more quickly become implementations, and those implementations are easily sharable, you have more time to find success.
Gigi was instrumental in our I3D 2024 paper Filter-Adapted Spatio-Temporal Sampling for Real-Time Rendering; we used Gigi to run most experiments, to gather data for graphs, and to generate images for diagrams and video clips. We also used Gigi to make the command line utility that produces our noise textures. You can find the generated code in the “fastnoise” folder of the code repository and the Gigi technique source in “fastnoise/Gigi”.
Another use of Gigi is in our Machine Learning For Game Developers video and blog series. It featured an interactive DX12 C++ demonstration that used a trained neural network to recognize hand-written digits, and it was made and code generated entirely within Gigi. You can see the generated code in the demo/mnist folder and the Gigi technique source in demo/mnist/Gigi.
In Closing
Gigi is young software, so you may encounter bugs or missing functionality as you use it. If you do, please log these issues in the GitHub repo so we know where best to spend development efforts to make the most significant impact.
Please see the readme in the repo for more information about Gigi, how to download it, and where to find learning resources: https://github.com/electronicarts/gigi
We look forward to hearing what you think about Gigi and seeing what you create!