Backport some fixes from part 2
This commit is contained in:
parent
5961486346
commit
fa5b40441d
8 changed files with 107 additions and 13 deletions
|
@ -463,7 +463,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
bindingInfo,
|
bindingInfo,
|
||||||
isImage,
|
isImage,
|
||||||
ref textureBufferBounds,
|
ref textureBufferBounds,
|
||||||
out bool isNewEnry);
|
out bool isNewEntry);
|
||||||
|
|
||||||
bool poolsModified = entry.PoolsModified();
|
bool poolsModified = entry.PoolsModified();
|
||||||
bool isStore = bindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore);
|
bool isStore = bindingInfo.Flags.HasFlag(TextureUsageFlags.ImageStore);
|
||||||
|
@ -471,7 +471,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
ReadOnlySpan<int> cachedTextureBuffer;
|
ReadOnlySpan<int> cachedTextureBuffer;
|
||||||
ReadOnlySpan<int> cachedSamplerBuffer;
|
ReadOnlySpan<int> cachedSamplerBuffer;
|
||||||
|
|
||||||
if (!poolsModified && !isNewEnry && entry.ValidateTextures())
|
if (!poolsModified && !isNewEntry && entry.ValidateTextures())
|
||||||
{
|
{
|
||||||
if (entry.MatchesSequenceNumber(_context.SequenceNumber))
|
if (entry.MatchesSequenceNumber(_context.SequenceNumber))
|
||||||
{
|
{
|
||||||
|
@ -532,7 +532,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isNewEnry)
|
if (!isNewEntry)
|
||||||
{
|
{
|
||||||
entry.Reset();
|
entry.Reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,36 @@ namespace Ryujinx.Graphics.Shader
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string ToShortSamplerType(this SamplerType type)
|
||||||
|
{
|
||||||
|
string typeName = (type & SamplerType.Mask) switch
|
||||||
|
{
|
||||||
|
SamplerType.Texture1D => "1d",
|
||||||
|
SamplerType.TextureBuffer => "b",
|
||||||
|
SamplerType.Texture2D => "2d",
|
||||||
|
SamplerType.Texture3D => "3d",
|
||||||
|
SamplerType.TextureCube => "cube",
|
||||||
|
_ => throw new ArgumentException($"Invalid sampler type \"{type}\"."),
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((type & SamplerType.Multisample) != 0)
|
||||||
|
{
|
||||||
|
typeName += "ms";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((type & SamplerType.Array) != 0)
|
||||||
|
{
|
||||||
|
typeName += "a";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((type & SamplerType.Shadow) != 0)
|
||||||
|
{
|
||||||
|
typeName += "s";
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeName;
|
||||||
|
}
|
||||||
|
|
||||||
public static string ToGlslSamplerType(this SamplerType type)
|
public static string ToGlslSamplerType(this SamplerType type)
|
||||||
{
|
{
|
||||||
string typeName = (type & SamplerType.Mask) switch
|
string typeName = (type & SamplerType.Mask) switch
|
||||||
|
|
|
@ -319,16 +319,22 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
}
|
}
|
||||||
|
|
||||||
string nameSuffix;
|
string nameSuffix;
|
||||||
|
string prefix = isImage ? "i" : "t";
|
||||||
|
|
||||||
|
if (arrayLength != 1 && type != SamplerType.None)
|
||||||
|
{
|
||||||
|
prefix += type.ToShortSamplerType();
|
||||||
|
}
|
||||||
|
|
||||||
if (isImage)
|
if (isImage)
|
||||||
{
|
{
|
||||||
nameSuffix = cbufSlot < 0
|
nameSuffix = cbufSlot < 0
|
||||||
? $"i_tcb_{handle:X}_{format.ToGlslFormat()}"
|
? $"{prefix}_tcb_{handle:X}_{format.ToGlslFormat()}"
|
||||||
: $"i_cb{cbufSlot}_{handle:X}_{format.ToGlslFormat()}";
|
: $"{prefix}_cb{cbufSlot}_{handle:X}_{format.ToGlslFormat()}";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nameSuffix = cbufSlot < 0 ? $"t_tcb_{handle:X}" : $"t_cb{cbufSlot}_{handle:X}";
|
nameSuffix = cbufSlot < 0 ? $"{prefix}_tcb_{handle:X}" : $"{prefix}_cb{cbufSlot}_{handle:X}";
|
||||||
}
|
}
|
||||||
|
|
||||||
var definition = new TextureDefinition(
|
var definition = new TextureDefinition(
|
||||||
|
|
|
@ -501,8 +501,18 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
if (_textureArrayRefs[binding].Stage != stage || _textureArrayRefs[binding].Array != array)
|
if (_textureArrayRefs[binding].Stage != stage || _textureArrayRefs[binding].Array != array)
|
||||||
{
|
{
|
||||||
|
if (_textureArrayRefs[binding].Array != null)
|
||||||
|
{
|
||||||
|
_textureArrayRefs[binding].Array.Bound = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array is TextureArray textureArray)
|
||||||
|
{
|
||||||
|
textureArray.Bound = true;
|
||||||
|
textureArray.QueueWriteToReadBarriers(cbs, stage.ConvertToPipelineStageFlags());
|
||||||
|
}
|
||||||
|
|
||||||
_textureArrayRefs[binding] = new ArrayRef<TextureArray>(stage, array as TextureArray);
|
_textureArrayRefs[binding] = new ArrayRef<TextureArray>(stage, array as TextureArray);
|
||||||
_textureArrayRefs[binding].Array?.QueueWriteToReadBarriers(cbs, stage.ConvertToPipelineStageFlags());
|
|
||||||
|
|
||||||
SignalDirty(DirtyFlags.Texture);
|
SignalDirty(DirtyFlags.Texture);
|
||||||
}
|
}
|
||||||
|
@ -517,8 +527,18 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
if (_imageArrayRefs[binding].Stage != stage || _imageArrayRefs[binding].Array != array)
|
if (_imageArrayRefs[binding].Stage != stage || _imageArrayRefs[binding].Array != array)
|
||||||
{
|
{
|
||||||
|
if (_imageArrayRefs[binding].Array != null)
|
||||||
|
{
|
||||||
|
_imageArrayRefs[binding].Array.Bound = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (array is ImageArray imageArray)
|
||||||
|
{
|
||||||
|
imageArray.Bound = true;
|
||||||
|
imageArray.QueueWriteToReadBarriers(cbs, stage.ConvertToPipelineStageFlags());
|
||||||
|
}
|
||||||
|
|
||||||
_imageArrayRefs[binding] = new ArrayRef<ImageArray>(stage, array as ImageArray);
|
_imageArrayRefs[binding] = new ArrayRef<ImageArray>(stage, array as ImageArray);
|
||||||
_imageArrayRefs[binding].Array?.QueueWriteToReadBarriers(cbs, stage.ConvertToPipelineStageFlags());
|
|
||||||
|
|
||||||
SignalDirty(DirtyFlags.Image);
|
SignalDirty(DirtyFlags.Image);
|
||||||
}
|
}
|
||||||
|
@ -922,6 +942,16 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
AdvancePdSequence();
|
AdvancePdSequence();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ForceTextureDirty()
|
||||||
|
{
|
||||||
|
SignalDirty(DirtyFlags.Texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForceImageDirty()
|
||||||
|
{
|
||||||
|
SignalDirty(DirtyFlags.Image);
|
||||||
|
}
|
||||||
|
|
||||||
private static void SwapBuffer(BufferRef[] list, Auto<DisposableBuffer> from, Auto<DisposableBuffer> to)
|
private static void SwapBuffer(BufferRef[] list, Auto<DisposableBuffer> from, Auto<DisposableBuffer> to)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < list.Length; i++)
|
for (int i = 0; i < list.Length; i++)
|
||||||
|
|
|
@ -7,6 +7,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
class ImageArray : IImageArray
|
class ImageArray : IImageArray
|
||||||
{
|
{
|
||||||
|
private readonly VulkanRenderer _gd;
|
||||||
|
|
||||||
private record struct TextureRef
|
private record struct TextureRef
|
||||||
{
|
{
|
||||||
public TextureStorage Storage;
|
public TextureStorage Storage;
|
||||||
|
@ -27,8 +29,14 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
private readonly bool _isBuffer;
|
private readonly bool _isBuffer;
|
||||||
|
|
||||||
public ImageArray(int size, bool isBuffer)
|
public bool Bound;
|
||||||
|
|
||||||
|
public bool IsDirty => _storages == null;
|
||||||
|
|
||||||
|
public ImageArray(VulkanRenderer gd, int size, bool isBuffer)
|
||||||
{
|
{
|
||||||
|
_gd = gd;
|
||||||
|
|
||||||
if (isBuffer)
|
if (isBuffer)
|
||||||
{
|
{
|
||||||
_bufferTextureRefs = new TextureBuffer[size];
|
_bufferTextureRefs = new TextureBuffer[size];
|
||||||
|
@ -91,6 +99,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
_cachedCommandBufferIndex = -1;
|
_cachedCommandBufferIndex = -1;
|
||||||
_storages = null;
|
_storages = null;
|
||||||
|
|
||||||
|
_gd.PipelineInternal.ForceImageDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags)
|
public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags)
|
||||||
|
|
|
@ -1385,6 +1385,16 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
SignalCommandBufferChange();
|
SignalCommandBufferChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ForceTextureDirty()
|
||||||
|
{
|
||||||
|
_descriptorSetUpdater.ForceTextureDirty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForceImageDirty()
|
||||||
|
{
|
||||||
|
_descriptorSetUpdater.ForceImageDirty();
|
||||||
|
}
|
||||||
|
|
||||||
public unsafe void TextureBarrier()
|
public unsafe void TextureBarrier()
|
||||||
{
|
{
|
||||||
MemoryBarrier memoryBarrier = new()
|
MemoryBarrier memoryBarrier = new()
|
||||||
|
|
|
@ -7,7 +7,9 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
class TextureArray : ITextureArray
|
class TextureArray : ITextureArray
|
||||||
{
|
{
|
||||||
private record struct TextureRef
|
private readonly VulkanRenderer _gd;
|
||||||
|
|
||||||
|
private struct TextureRef
|
||||||
{
|
{
|
||||||
public TextureStorage Storage;
|
public TextureStorage Storage;
|
||||||
public Auto<DisposableImageView> View;
|
public Auto<DisposableImageView> View;
|
||||||
|
@ -27,8 +29,12 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
private readonly bool _isBuffer;
|
private readonly bool _isBuffer;
|
||||||
|
|
||||||
public TextureArray(int size, bool isBuffer)
|
public bool Bound;
|
||||||
|
|
||||||
|
public TextureArray(VulkanRenderer gd, int size, bool isBuffer)
|
||||||
{
|
{
|
||||||
|
_gd = gd;
|
||||||
|
|
||||||
if (isBuffer)
|
if (isBuffer)
|
||||||
{
|
{
|
||||||
_bufferTextureRefs = new TextureBuffer[size];
|
_bufferTextureRefs = new TextureBuffer[size];
|
||||||
|
@ -100,6 +106,8 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
{
|
{
|
||||||
_cachedCommandBufferIndex = -1;
|
_cachedCommandBufferIndex = -1;
|
||||||
_storages = null;
|
_storages = null;
|
||||||
|
|
||||||
|
_gd.PipelineInternal.ForceTextureDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags)
|
public void QueueWriteToReadBarriers(CommandBufferScoped cbs, PipelineStageFlags stageFlags)
|
||||||
|
|
|
@ -506,7 +506,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
public IImageArray CreateImageArray(int size, bool isBuffer)
|
public IImageArray CreateImageArray(int size, bool isBuffer)
|
||||||
{
|
{
|
||||||
return new ImageArray(size, isBuffer);
|
return new ImageArray(this, size, isBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IProgram CreateProgram(ShaderSource[] sources, ShaderInfo info)
|
public IProgram CreateProgram(ShaderSource[] sources, ShaderInfo info)
|
||||||
|
@ -543,7 +543,7 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
public ITextureArray CreateTextureArray(int size, bool isBuffer)
|
public ITextureArray CreateTextureArray(int size, bool isBuffer)
|
||||||
{
|
{
|
||||||
return new TextureArray(size, isBuffer);
|
return new TextureArray(this, size, isBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal TextureView CreateTextureView(TextureCreateInfo info)
|
internal TextureView CreateTextureView(TextureCreateInfo info)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue