Nova Update: March 2018

What happened in March? The better question would be: what didn't happen in March?

Render Graph Initial Revision

In February I announced that Nova would be adopting a data-driven render graph system. This system would give shader developers a lot of flexibility in how they set up their shaders and would make Nova a data-driven renderer with practically nothing hardcoded. Forward, deferred, tiled deferred, hybrid forward+ - all these will be possible by simply changing some data.

On March 9th I got the initial revision of this system working. I could build a rendering pipeline in data and it would Just Work. This was exciting. There were a few bugs, but the basic tech was working. 

However, I realized that the existing material system wouldn't handle all I needed it to handle. Specifically, there's currently no way for objects for one material to have different textures - which has led to text not working very well. Nova currently mixes two concepts - a material and material instance in Unreal Engine 4 terms - that really should be separate. Future work will separate these concepts and lead to something much, much better.

Vacation and GDC

From March 10th - 18th my girlfriend was in town visiting. We had a lot of fun, but naturally, I didn't make any progress on Nova during that time.

GDC was March 19th - 23rd. I attended many sessions, including a number of talks about Vulkan. The result of all those talks was....

I'm Making Nova Vulkan Again

Yes, I'm switching back to Vulkan.

After listening to the talks at GDC, I can't not use Vulkan any longer. It's become overwhelmingly clear that Vulkan is the future and OpenGL will not deliver the performance that Vulkan can. So, it's time to get the Vulkan branch working.

When I last left off, RenderDoc didn't give any useful information - it reported everything as 0. However, there was a new RenderDoc version since I last tried using it, so I ran Nova with the new RenderDoc to see if there was still that problem...and Nova crashed. So I tried running Nova normally, and it didn't crash. It would appear RenderDoc is crashing Nova.

I have filed an issue on the RenderDoc GitHub, but I can't wait for RenderDoc to update. So I have begun digging into the RenderDoc code myself to try and see what is crashing Nova. A few hours of hardcore debugging later and I noticed that I was destroying a buffer, but then trying to use it. This made Vulkan crash, since Vulkan doesn't handle errors so that it can deliver maximum speed. I'm not sure why Nova was crashing in RenderDoc, but not when run normally, but I noticed slightly different behavior when it was running with RenderDoc before.

After that there were a number of smaller bugs. Vulkan requires thinking a little differently than OpenGL, and that takes some time to get used to. Still, I persevered, and got the Vulkan branch to draw things on screen. At that point the rest was details.

Render Graph 2: Hydroelectric Boogaloo

With the render graph code written, and the Vulkan code getting written, it's now time to put the two together. March ended with starting to merge the render graph into the Vulkan code, adapting it where needed and rethinking some of the Vulkan code to better fir the the render graph. Many challenges remain, but Nova is set up to be a very powerful shader development environment.