NVIDIAGameWorks / NRI

Low-level abstract render interface
MIT License
217 stars 25 forks source link

Pipeline library / cache support #36

Open vertver opened 9 months ago

vertver commented 9 months ago

On D3D12 and Vulkan there is a problem with the PSO build process. Sometimes the game can hang, and not only that - you, as a developer, cannot directly predict the pipeline build time. Also, on GDK you can't build PSO at runtime, only pre-compile. So I think this feature is most needed in NRI as an extension because it affects a lot of things. What do you think? Maybe we need some priorities for our tasks to manage them properly?

dzhdanNV commented 9 months ago

Seems useful. Hope VK has this functionality too (sorry, I'm out of topic for now). Regarding priorities:

Then we can adjust further steps. And of course, there are other higher priority than NRI tasks I have to work on.

vertver commented 8 months ago

I did some research about pipeline library, and here is what I found:

Pipeline library in D3D12 and in Vulkan are absolutely different things. In D3D12 ID3D12PipelineLibrary was created for storing and loading multiple pipelines into/from one file/chunk. However, in Vulkan, pipeline library was created for building multiple parts of pipeline (rasteriser state, output merger, etc) and combining them into one big pipeline.

However, AFAIK, you can use PSO cache on both APIs. So, I think that maybe we can drop Vulkan behaviour and use D3D12 description of pipeline library. Also, it might be possible to emulate this behaviour on D3D11 and use this functionality in core.

References: D3D12 (see CachedPSO for more info) Vulkan sample

dzhdanNV commented 8 months ago

Hi! Since you are interested and I'm busy with other stuff, I don't mind if you add ext (or core?) functionality, even focusing more on D3D12. I would suggest starting with the API to ensure quality, the implementation is less important because it can be improved later. I promise (fingers crossed ^_^) to accept these changes.

dzhdanNV commented 8 months ago

Thanks for the links! Despite that VK solution is different, it seems to solve the same problem. I hope there is an API covering both GAPIs. For D3D11, I think, pipeline cache API can be made NOP (i.e. do nothing) because there is no such functionality on D3D11 (only implicit shader cache).

Most likely PSO caching will go into Core because:

vertver commented 8 months ago

At the moment I'm busy with work on my project, so this month and possibly next month I won't be able to contribute to the NRI (only minor things, bugfixes). But closer to April-May I will upload something for pipelines and other changes.

dzhdanNV commented 8 months ago

Sounds good! Good luck with your work. I'm always happy to see NRI changes and feature requests from you. As I promised, the streamer interface will be implemented soon.

dzhdanNV commented 3 months ago

Related: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_EXT_pipeline_creation_cache_control.html https://registry.khronos.org/vulkan/specs/1.3/html/vkspec.html#VkPipelineCache https://microsoft.github.io/DirectX-Specs/d3d/ShaderCache.html https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_cached_pipeline_state