mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 08:59:04 -06:00 
			
		
		
		
	Vulkan: Add missing barriers for texture to buffer copy (#7092)
This barrier has always been missing, but it only became apparent when #7012 merged. I also added some barriers in case the target buffer used here is used by other commands, though right now it isn't. Fixes a regression where water would turn white on AMD GPUs with the proprietary driver. May fix other issues on this driver.
This commit is contained in:
		@@ -667,8 +667,36 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
 | 
			
		||||
            if (PrepareOutputBuffer(cbs, hostSize, buffer, out VkBuffer copyToBuffer, out BufferHolder tempCopyHolder))
 | 
			
		||||
            {
 | 
			
		||||
                // No barrier necessary, as this is a temporary copy buffer.
 | 
			
		||||
                offset = 0;
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                BufferHolder.InsertBufferBarrier(
 | 
			
		||||
                    _gd,
 | 
			
		||||
                    cbs.CommandBuffer,
 | 
			
		||||
                    copyToBuffer,
 | 
			
		||||
                    BufferHolder.DefaultAccessFlags,
 | 
			
		||||
                    AccessFlags.TransferWriteBit,
 | 
			
		||||
                    PipelineStageFlags.AllCommandsBit,
 | 
			
		||||
                    PipelineStageFlags.TransferBit,
 | 
			
		||||
                    offset,
 | 
			
		||||
                    outSize);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            InsertImageBarrier(
 | 
			
		||||
                _gd.Api,
 | 
			
		||||
                cbs.CommandBuffer,
 | 
			
		||||
                image,
 | 
			
		||||
                TextureStorage.DefaultAccessMask,
 | 
			
		||||
                AccessFlags.TransferReadBit,
 | 
			
		||||
                PipelineStageFlags.AllCommandsBit,
 | 
			
		||||
                PipelineStageFlags.TransferBit,
 | 
			
		||||
                Info.Format.ConvertAspectFlags(),
 | 
			
		||||
                FirstLayer + layer,
 | 
			
		||||
                FirstLevel + level,
 | 
			
		||||
                1,
 | 
			
		||||
                1);
 | 
			
		||||
 | 
			
		||||
            CopyFromOrToBuffer(cbs.CommandBuffer, copyToBuffer, image, hostSize, true, layer, level, 1, 1, singleSlice: true, offset, stride);
 | 
			
		||||
 | 
			
		||||
@@ -677,6 +705,19 @@ namespace Ryujinx.Graphics.Vulkan
 | 
			
		||||
                CopyDataToOutputBuffer(cbs, tempCopyHolder, autoBuffer, hostSize, range.Offset);
 | 
			
		||||
                tempCopyHolder.Dispose();
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                BufferHolder.InsertBufferBarrier(
 | 
			
		||||
                    _gd,
 | 
			
		||||
                    cbs.CommandBuffer,
 | 
			
		||||
                    copyToBuffer,
 | 
			
		||||
                    AccessFlags.TransferWriteBit,
 | 
			
		||||
                    BufferHolder.DefaultAccessFlags,
 | 
			
		||||
                    PipelineStageFlags.TransferBit,
 | 
			
		||||
                    PipelineStageFlags.AllCommandsBit,
 | 
			
		||||
                    offset,
 | 
			
		||||
                    outSize);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private ReadOnlySpan<byte> GetData(CommandBufferPool cbp, PersistentFlushBuffer flushBuffer)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user