NRI icon indicating copy to clipboard operation
NRI copied to clipboard

Pipeline library / cache support

Open vertver opened this issue 2 years ago • 7 comments

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?

vertver avatar Feb 02 '24 13:02 vertver

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

  • barrier API change: enhanced barriers == VK_KHR_synchronization2 (#35)
  • implement streamer (#34)

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

dzhdanNV avatar Feb 02 '24 15:02 dzhdanNV

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

vertver avatar Feb 15 '24 02:02 vertver

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 avatar Feb 21 '24 04:02 dzhdanNV

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:

  • a few new functions will be exposed
  • no extensions needed for GAPI (it's basic functionality)
  • seems to fit better here

dzhdanNV avatar Feb 21 '24 04:02 dzhdanNV

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.

vertver avatar Feb 26 '24 15:02 vertver

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 avatar Feb 27 '24 02:02 dzhdanNV

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

dzhdanNV avatar Jul 13 '24 07:07 dzhdanNV