RyuKen/Ryujinx.Graphics.Vulkan
riperiperi c3c41fa4bb
Periodically Flush Commands for Vulkan (#3689)
* Periodically Flush Commands for Vulkan

NVIDIA's OpenGL driver has a built-in mechanism to automatically flush commands to GPU when a lot have been queued. It's also pretty inconsistent, but we'll ignore that for now.

Our Vulkan implementation only submits a command buffer (flush equivalent) when it needs to. This is typically when another command buffer needs to be sequenced after it, presenting a frame, or an edge case where we flush around GPU queries to get results sooner.

This difference in flush behaviour causes a notable difference between Vulkan and OpenGL when we have to wait for commands. In the worst case, we will wait for a sync point that has just been created. In Vulkan, this sync point is created by flushing the command buffer, and storing a waitable fence that signals its completion. Our command buffer contains _every command that we queued since the last submit_, which could be an entire frame's worth of draws.

This has a huge effect on CPU <-> GPU latency. The more commands in a command buffer, the longer we have to wait for it to complete, which results in wasted time. Because we don't know when the guest will force us to wait, we always want the smallest possible latency.

By periodically flushing, we ensure that each command buffer takes a more consistent, smaller amount of time to execute, and that the back of the GPU queue isn't as far away when we need to wait for something to happen. This also might reduce time that the GPU is left inactive while commands are being built.

The main affected game is Pokemon Sword, which got significantly faster in overworld areas due to reduced waiting time when it flushes a shadow map from the main GPU thread.

Another affected game is BOTW, which gets faster depending on the area. This game flushes textures/buffers from its game thread, which is the bottleneck.

Flush latency and throughput may be improved on other games that are inexplicably slower than OpenGL. It's possible that certain games could have their performance _decreased_ slightly due to flushes not being free, but it is unlikely.

Also, flushing to get query results sooner has been tweaked to improve the number of full draw skips that can be done. (tested in SMO)

* Remove unused variable

* Fix possible issue with early query flush
2022-09-14 13:48:31 -03:00
..
Queries Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
Shaders Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
Auto.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
AutoFlushCounter.cs Periodically Flush Commands for Vulkan (#3689) 2022-09-14 13:48:31 -03:00
BackgroundResources.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
BitMap.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
BufferHolder.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
BufferManager.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
BufferState.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
BufferUsageBitmap.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
CacheByRange.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
CommandBufferPool.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
CommandBufferScoped.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
Constants.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DescriptorSetCollection.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DescriptorSetManager.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DescriptorSetUpdater.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
DisposableBuffer.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableBufferView.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableFramebuffer.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableImage.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableImageView.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableMemory.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposablePipeline.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableRenderPass.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
DisposableSampler.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
EnumConversion.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
FenceHelper.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
FenceHolder.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
FormatCapabilities.cs Fix R4G4B4A4 format on Vulkan (#3696) 2022-09-13 07:59:38 +02:00
FormatConverter.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
FormatTable.cs Fix R4G4B4A4 format on Vulkan (#3696) 2022-09-13 07:59:38 +02:00
FramebufferParams.cs Implement HLE macros for render target clears (#3528) 2022-08-04 21:30:08 +00:00
HardwareCapabilities.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
HashTableSlim.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
HelperShader.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
IdList.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
ImageWindow.cs Avalonia - Couple fixes and improvements to vulkan (#3483) 2022-08-16 16:32:37 +00:00
MemoryAllocation.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
MemoryAllocator.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
MemoryAllocatorBlockList.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
MultiFenceHolder.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
NativeArray.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
PersistentFlushBuffer.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
PipelineBase.cs Periodically Flush Commands for Vulkan (#3689) 2022-09-14 13:48:31 -03:00
PipelineConverter.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
PipelineDynamicState.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
PipelineFull.cs Periodically Flush Commands for Vulkan (#3689) 2022-09-14 13:48:31 -03:00
PipelineHelperShader.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
PipelineLayoutCache.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
PipelineLayoutCacheEntry.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
PipelineLayoutFactory.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
PipelineState.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
PipelineUid.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
Ryujinx.Graphics.Vulkan.csproj Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
SamplerHolder.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
SemaphoreHolder.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
Shader.cs Removed extra semicolons. (#3594) 2022-08-17 09:05:15 +02:00
ShaderCollection.cs Rename ToSpan to AsSpan (#3556) 2022-08-11 18:07:37 -03:00
StagingBuffer.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
SyncManager.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
TextureBuffer.cs Fast path for Inline-to-Memory texture data transfers (#3610) 2022-08-26 02:16:41 +00:00
TextureCopy.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
TextureStorage.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
TextureView.cs Fix R4G4B4A4 format on Vulkan (#3696) 2022-09-13 07:59:38 +02:00
Vendor.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
VertexBufferState.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
VulkanConfiguration.cs Use RGBA16 vertex format if RGB16 is not supported on Vulkan (#3552) 2022-08-20 16:20:27 -03:00
VulkanException.cs Vulkan backend (#2518) 2022-07-31 18:26:06 -03:00
VulkanInitialization.cs Restride vertex buffer when stride causes attributes to misalign in Vulkan. (#3679) 2022-09-08 20:30:19 -03:00
VulkanRenderer.cs Do not output ViewportIndex on SPIR-V if GPU does not support it (#3644) 2022-09-10 13:20:23 +00:00
Window.cs Avalonia - Couple fixes and improvements to vulkan (#3483) 2022-08-16 16:32:37 +00:00
WindowBase.cs Avalonia - Couple fixes and improvements to vulkan (#3483) 2022-08-16 16:32:37 +00:00