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>
|
/// <summary>
|
||||||
/// Version of the codegen (to be changed when codegen or guest format change).
|
/// Version of the codegen (to be changed when codegen or guest format change).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private const ulong ShaderCodeGenVersion = 2298;
|
private const ulong ShaderCodeGenVersion = 2300;
|
||||||
|
|
||||||
// Progress reporting helpers
|
// Progress reporting helpers
|
||||||
private volatile int _shaderCount;
|
private volatile int _shaderCount;
|
||||||
|
|
|
@ -163,6 +163,34 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
Size += size;
|
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)
|
public void SetClipDistanceWritten(int index)
|
||||||
{
|
{
|
||||||
ClipDistancesWritten |= (byte)(1 << index);
|
ClipDistancesWritten |= (byte)(1 << index);
|
||||||
|
@ -269,17 +297,7 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
|
|
||||||
if (dict.TryGetValue(info, out var existingMeta))
|
if (dict.TryGetValue(info, out var existingMeta))
|
||||||
{
|
{
|
||||||
meta.UsageFlags |= existingMeta.UsageFlags;
|
dict[info] = MergeTextureMeta(meta, existingMeta);
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
else
|
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()
|
public BufferDescriptor[] GetConstantBufferDescriptors()
|
||||||
{
|
{
|
||||||
if (_cachedConstantBufferDescriptors != null)
|
if (_cachedConstantBufferDescriptors != null)
|
||||||
|
|
|
@ -132,10 +132,9 @@ namespace Ryujinx.Graphics.Shader.Translation
|
||||||
|
|
||||||
if (other != null)
|
if (other != null)
|
||||||
{
|
{
|
||||||
_config.SetUsedFeature(other._config.UsedFeatures);
|
|
||||||
TextureHandlesForCache.UnionWith(other.TextureHandlesForCache);
|
|
||||||
|
|
||||||
code = Combine(EmitShader(other._cfg, other._config), code);
|
code = Combine(EmitShader(other._cfg, other._config), code);
|
||||||
|
|
||||||
|
_config.InheritFrom(other._config);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Translator.Translate(code, _config, out shaderProgramInfo);
|
return Translator.Translate(code, _config, out shaderProgramInfo);
|
||||||
|
|
Loading…
Reference in a new issue