Block Design
FuryGpu is, at a high level, a somewhat typical fixed-function tiled rasterizer. A graphics Command Processor interprets command lists in memory, submitting draw calls to the Input Assembler, which reads indices from memory and builds batches of primitive to be forwarded along to the Vertex Shader. Vertices are read from memory, transformed from local space into clip space, and exported to the Primitive Assembler which performs clipping and assembles valid primitives. These valid primitives are binned into screen tiles by the Tile Binner, generating per-tile primitive lists that are consumed by the set of four Rasterizers. Each Rasterizer is given a screen tile to rasterize, iterates over the primitives contained in that tile, and performs fixed-function rasterization of each. The entire process is fully pipelined, providing extremely high throughput and enabling the rendering of real-world scenes at real-time frame rates.
Videos
The above playlist contains all the videos captured of FuryGpu’s progress over the years. Be sure to set the quality of the player as high as possible - YouTube’s compression does not do well with this kind of content!
Feel free to visit the playlist on YouTube directly!
About
FuryGpu has been created by me, Dylan Barrie. As a software engineer with over two decades of rendering experience under my belt, I’ve always been interested in the hardware that makes what I do for a living possible. FuryGpu is an attempt to really figure out the details, and expand my understanding of digital design and what it takes to make something as extraordinarily complex as a working GPU that runs on modern machines. Two and a half years later, and I have something that I can plug into a modern Windows machine, install drivers for, and play games on.
That is not to say that this GPU is modern, or has modern capabilities. It is (at the moment) fully fixed-function, with no programmable shading to speak of. It runs off a custom Vulkan-like graphics API (“FuryGL”) and due to the lack of shaders and other modern features, is unable to support modern D3D or Vulkan. Everything that runs on it has been ported to do so, and while that is not a massive undertaking, it’s not a trivial thing to do either. That being said, FuryGpu lives in a state of forever being a work in progress and there are very few things I’ve decided are entirely off the table.
A brief list of some of the features currently supported:
Tile-based fixed-function rasterizer
Four independent tile rasterizers
400MHz GPU clock, 480MHz Texture Unit clock
Full fp32 floating-point front-end
Texture Units capable of performing linear and bilinear filtering on mip-mapped image samples
PCIe Gen 2x4 host interface
It runs games!
My intention is to open-source everything at some point, when I am happy with where things are and have navigated the intricacies involved in working in a field that is tangentially-related to this work. There is no timeline for when any open-sourcing will take place.
Contact
I can be contacted at furygpu@gfxcatalyst.com.
Requests regarding access to the design or open-source timelines will be ignored.