diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/TextureView.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/TextureView.cs | 204 |
1 files changed, 5 insertions, 199 deletions
diff --git a/Ryujinx.Graphics.Vulkan/TextureView.cs b/Ryujinx.Graphics.Vulkan/TextureView.cs index 67f20721..3ee19675 100644 --- a/Ryujinx.Graphics.Vulkan/TextureView.cs +++ b/Ryujinx.Graphics.Vulkan/TextureView.cs @@ -364,19 +364,14 @@ namespace Ryujinx.Graphics.Vulkan return; } - else if (srcFormat == GAL.Format.D32FloatS8Uint && srcFormat == dstFormat && SupportsBlitFromD32FS8ToD32FAndS8()) - { - BlitDepthStencilWithBuffer(_gd, cbs, src, dst, srcRegion, dstRegion); - - return; - } } + bool isDepthOrStencil = dst.Info.Format.IsDepthOrStencil(); + if (VulkanConfiguration.UseSlowSafeBlitOnAmd && (_gd.Vendor == Vendor.Amd || _gd.IsMoltenVk) && src.Info.Target == Target.Texture2D && - dst.Info.Target == Target.Texture2D && - !dst.Info.Format.IsDepthOrStencil()) + dst.Info.Target == Target.Texture2D) { _gd.HelperShader.Blit( _gd, @@ -387,6 +382,7 @@ namespace Ryujinx.Graphics.Vulkan dst.VkFormat, srcRegion, dstRegion, + isDepthOrStencil, linearFilter); return; @@ -395,7 +391,7 @@ namespace Ryujinx.Graphics.Vulkan Auto<DisposableImage> srcImage; Auto<DisposableImage> dstImage; - if (dst.Info.Format.IsDepthOrStencil()) + if (isDepthOrStencil) { srcImage = src.Storage.CreateAliasedColorForDepthStorageUnsafe(srcFormat).GetImage(); dstImage = dst.Storage.CreateAliasedColorForDepthStorageUnsafe(dstFormat).GetImage(); @@ -426,189 +422,6 @@ namespace Ryujinx.Graphics.Vulkan ImageAspectFlags.ColorBit); } - private static void BlitDepthStencilWithBuffer( - VulkanRenderer gd, - CommandBufferScoped cbs, - TextureView src, - TextureView dst, - Extents2D srcRegion, - Extents2D dstRegion) - { - int drBaseX = Math.Min(dstRegion.X1, dstRegion.X2); - int drBaseY = Math.Min(dstRegion.Y1, dstRegion.Y2); - int drWidth = Math.Abs(dstRegion.X2 - dstRegion.X1); - int drHeight = Math.Abs(dstRegion.Y2 - dstRegion.Y1); - - var drOriginZero = new Extents2D( - dstRegion.X1 - drBaseX, - dstRegion.Y1 - drBaseY, - dstRegion.X2 - drBaseX, - dstRegion.Y2 - drBaseY); - - var d32SrcStorageInfo = TextureStorage.NewCreateInfoWith(ref src._info, GAL.Format.D32Float, 4); - var d32DstStorageInfo = TextureStorage.NewCreateInfoWith(ref dst._info, GAL.Format.D32Float, 4, drWidth, drHeight); - var s8SrcStorageInfo = TextureStorage.NewCreateInfoWith(ref src._info, GAL.Format.S8Uint, 1); - var s8DstStorageInfo = TextureStorage.NewCreateInfoWith(ref dst._info, GAL.Format.S8Uint, 1, drWidth, drHeight); - - using var d32SrcStorage = gd.CreateTextureStorage(d32SrcStorageInfo, src.Storage.ScaleFactor); - using var d32DstStorage = gd.CreateTextureStorage(d32DstStorageInfo, dst.Storage.ScaleFactor); - using var s8SrcStorage = gd.CreateTextureStorage(s8SrcStorageInfo, src.Storage.ScaleFactor); - using var s8DstStorage = gd.CreateTextureStorage(s8DstStorageInfo, dst.Storage.ScaleFactor); - - void SlowBlit(TextureStorage srcTemp, TextureStorage dstTemp, ImageAspectFlags aspectFlags) - { - int levels = Math.Min(src.Info.Levels, dst.Info.Levels); - - int srcSize = 0; - int dstSize = 0; - - for (int l = 0; l < levels; l++) - { - srcSize += srcTemp.Info.GetMipSize2D(l); - dstSize += dstTemp.Info.GetMipSize2D(l); - } - - using var srcTempBuffer = gd.BufferManager.Create(gd, srcSize, deviceLocal: true); - using var dstTempBuffer = gd.BufferManager.Create(gd, dstSize, deviceLocal: true); - - src.Storage.CopyFromOrToBuffer( - cbs.CommandBuffer, - srcTempBuffer.GetBuffer().Get(cbs, 0, srcSize).Value, - src.GetImage().Get(cbs).Value, - srcSize, - to: true, - 0, - 0, - src.FirstLayer, - src.FirstLevel, - 1, - levels, - true, - aspectFlags, - false); - - BufferHolder.InsertBufferBarrier( - gd, - cbs.CommandBuffer, - srcTempBuffer.GetBuffer().Get(cbs, 0, srcSize).Value, - AccessFlags.TransferWriteBit, - AccessFlags.TransferReadBit, - PipelineStageFlags.TransferBit, - PipelineStageFlags.TransferBit, - 0, - srcSize); - - srcTemp.CopyFromOrToBuffer( - cbs.CommandBuffer, - srcTempBuffer.GetBuffer().Get(cbs, 0, srcSize).Value, - srcTemp.GetImage().Get(cbs).Value, - srcSize, - to: false, - 0, - 0, - 0, - 0, - 1, - levels, - true, - aspectFlags, - false); - - InsertImageBarrier( - gd.Api, - cbs.CommandBuffer, - srcTemp.GetImage().Get(cbs).Value, - AccessFlags.TransferWriteBit, - AccessFlags.TransferReadBit, - PipelineStageFlags.TransferBit, - PipelineStageFlags.TransferBit, - aspectFlags, - 0, - 0, - 1, - levels); - - TextureCopy.Blit( - gd.Api, - cbs.CommandBuffer, - srcTemp.GetImage().Get(cbs).Value, - dstTemp.GetImage().Get(cbs).Value, - srcTemp.Info, - dstTemp.Info, - srcRegion, - drOriginZero, - 0, - 0, - 0, - 0, - 1, - levels, - false, - aspectFlags, - aspectFlags); - - InsertImageBarrier( - gd.Api, - cbs.CommandBuffer, - dstTemp.GetImage().Get(cbs).Value, - AccessFlags.TransferWriteBit, - AccessFlags.TransferReadBit, - PipelineStageFlags.TransferBit, - PipelineStageFlags.TransferBit, - aspectFlags, - 0, - 0, - 1, - levels); - - dstTemp.CopyFromOrToBuffer( - cbs.CommandBuffer, - dstTempBuffer.GetBuffer().Get(cbs, 0, dstSize).Value, - dstTemp.GetImage().Get(cbs).Value, - dstSize, - to: true, - 0, - 0, - 0, - 0, - 1, - levels, - true, - aspectFlags, - false); - - BufferHolder.InsertBufferBarrier( - gd, - cbs.CommandBuffer, - dstTempBuffer.GetBuffer().Get(cbs, 0, dstSize).Value, - AccessFlags.TransferWriteBit, - AccessFlags.TransferReadBit, - PipelineStageFlags.TransferBit, - PipelineStageFlags.TransferBit, - 0, - dstSize); - - dst.Storage.CopyFromOrToBuffer( - cbs.CommandBuffer, - dstTempBuffer.GetBuffer().Get(cbs, 0, dstSize).Value, - dst.GetImage().Get(cbs).Value, - dstSize, - to: false, - drBaseX, - drBaseY, - dst.FirstLayer, - dst.FirstLevel, - 1, - levels, - true, - aspectFlags, - false); - } - - SlowBlit(d32SrcStorage, d32DstStorage, ImageAspectFlags.DepthBit); - SlowBlit(s8SrcStorage, s8DstStorage, ImageAspectFlags.StencilBit); - } - public static unsafe void InsertImageBarrier( Vk api, CommandBuffer commandBuffer, @@ -649,13 +462,6 @@ namespace Ryujinx.Graphics.Vulkan memoryBarrier); } - private bool SupportsBlitFromD32FS8ToD32FAndS8() - { - var formatFeatureFlags = FormatFeatureFlags.BlitSrcBit | FormatFeatureFlags.BlitDstBit; - return _gd.FormatCapabilities.OptimalFormatSupports(formatFeatureFlags, GAL.Format.D32Float) && - _gd.FormatCapabilities.OptimalFormatSupports(formatFeatureFlags, GAL.Format.S8Uint); - } - public TextureView GetView(GAL.Format format) { if (format == Info.Format) |