Fix buffer and texture uses not being propagated for vertex A/B shaders (#2300)
* Fix buffer and texture uses not being propagated for vertex A/B shaders * Shader cache version bump
This commit is contained in:
parent
b34c0a47b4
commit
12533e5c9d
3 changed files with 47 additions and 15 deletions
|
@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Gpu.Shader
|
|||
/// <summary>
|
||||
/// Version of the codegen (to be changed when codegen or guest format change).
|
||||
/// </summary>
|
||||
private const ulong ShaderCodeGenVersion = 2298;
|
||||
private const ulong ShaderCodeGenVersion = 2300;
|
||||
|
||||
// Progress reporting helpers
|
||||
private volatile int _shaderCount;
|
||||
|
|
|
@ -163,6 +163,34 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
Size += size;
|
||||
}
|
||||
|
||||
public void InheritFrom(ShaderConfig other)
|
||||
{
|
||||
ClipDistancesWritten |= other.ClipDistancesWritten;
|
||||
UsedFeatures |= other.UsedFeatures;
|
||||
|
||||
TextureHandlesForCache.UnionWith(other.TextureHandlesForCache);
|
||||
|
||||
_usedConstantBuffers |= other._usedConstantBuffers;
|
||||
_usedStorageBuffers |= other._usedStorageBuffers;
|
||||
_usedStorageBuffersWrite |= other._usedStorageBuffersWrite;
|
||||
|
||||
foreach (var kv in other._usedTextures)
|
||||
{
|
||||
if (!_usedTextures.TryAdd(kv.Key, kv.Value))
|
||||
{
|
||||
_usedTextures[kv.Key] = MergeTextureMeta(kv.Value, _usedTextures[kv.Key]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var kv in other._usedImages)
|
||||
{
|
||||
if (!_usedImages.TryAdd(kv.Key, kv.Value))
|
||||
{
|
||||
_usedImages[kv.Key] = MergeTextureMeta(kv.Value, _usedImages[kv.Key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetClipDistanceWritten(int index)
|
||||
{
|
||||
ClipDistancesWritten |= (byte)(1 << index);
|
||||
|
@ -269,17 +297,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
|
||||
if (dict.TryGetValue(info, out var existingMeta))
|
||||
{
|
||||
meta.UsageFlags |= existingMeta.UsageFlags;
|
||||
|
||||
// If the texture we have has inaccurate type information, then
|
||||
// we prefer the most accurate one.
|
||||
if (existingMeta.AccurateType)
|
||||
{
|
||||
meta.AccurateType = true;
|
||||
meta.Type = existingMeta.Type;
|
||||
}
|
||||
|
||||
dict[info] = meta;
|
||||
dict[info] = MergeTextureMeta(meta, existingMeta);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -288,6 +306,21 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
}
|
||||
}
|
||||
|
||||
private static TextureMeta MergeTextureMeta(TextureMeta meta, TextureMeta existingMeta)
|
||||
{
|
||||
meta.UsageFlags |= existingMeta.UsageFlags;
|
||||
|
||||
// If the texture we have has inaccurate type information, then
|
||||
// we prefer the most accurate one.
|
||||
if (existingMeta.AccurateType)
|
||||
{
|
||||
meta.AccurateType = true;
|
||||
meta.Type = existingMeta.Type;
|
||||
}
|
||||
|
||||
return meta;
|
||||
}
|
||||
|
||||
public BufferDescriptor[] GetConstantBufferDescriptors()
|
||||
{
|
||||
if (_cachedConstantBufferDescriptors != null)
|
||||
|
|
|
@ -132,10 +132,9 @@ namespace Ryujinx.Graphics.Shader.Translation
|
|||
|
||||
if (other != null)
|
||||
{
|
||||
_config.SetUsedFeature(other._config.UsedFeatures);
|
||||
TextureHandlesForCache.UnionWith(other.TextureHandlesForCache);
|
||||
|
||||
code = Combine(EmitShader(other._cfg, other._config), code);
|
||||
|
||||
_config.InheritFrom(other._config);
|
||||
}
|
||||
|
||||
return Translator.Translate(code, _config, out shaderProgramInfo);
|
||||
|
|
Reference in a new issue