aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Shader')
-rw-r--r--Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs55
-rw-r--r--Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs5
2 files changed, 46 insertions, 14 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
index 8004e313..b193d61e 100644
--- a/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
+++ b/Ryujinx.Graphics.Shader/Translation/ShaderConfig.cs
@@ -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)
diff --git a/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs b/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
index 649911a2..ab74d039 100644
--- a/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
+++ b/Ryujinx.Graphics.Shader/Translation/TranslatorContext.cs
@@ -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);