aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs')
-rw-r--r--src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs66
1 files changed, 51 insertions, 15 deletions
diff --git a/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs b/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs
index b7e379c6..8c12c2aa 100644
--- a/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs
+++ b/src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs
@@ -18,8 +18,6 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
public IReadOnlyDictionary<int, MemoryDefinition> LocalMemories => _localMemories;
public IReadOnlyDictionary<int, MemoryDefinition> SharedMemories => _sharedMemories;
- public readonly bool OriginUpperLeft;
-
public ShaderProperties()
{
_constantBuffers = new Dictionary<int, BufferDefinition>();
@@ -30,29 +28,24 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
_sharedMemories = new Dictionary<int, MemoryDefinition>();
}
- public ShaderProperties(bool originUpperLeft) : this()
- {
- OriginUpperLeft = originUpperLeft;
- }
-
- public void AddOrUpdateConstantBuffer(int binding, BufferDefinition definition)
+ public void AddOrUpdateConstantBuffer(BufferDefinition definition)
{
- _constantBuffers[binding] = definition;
+ _constantBuffers[definition.Binding] = definition;
}
- public void AddOrUpdateStorageBuffer(int binding, BufferDefinition definition)
+ public void AddOrUpdateStorageBuffer(BufferDefinition definition)
{
- _storageBuffers[binding] = definition;
+ _storageBuffers[definition.Binding] = definition;
}
- public void AddOrUpdateTexture(int binding, TextureDefinition descriptor)
+ public void AddOrUpdateTexture(TextureDefinition definition)
{
- _textures[binding] = descriptor;
+ _textures[definition.Binding] = definition;
}
- public void AddOrUpdateImage(int binding, TextureDefinition descriptor)
+ public void AddOrUpdateImage(TextureDefinition definition)
{
- _images[binding] = descriptor;
+ _images[definition.Binding] = definition;
}
public int AddLocalMemory(MemoryDefinition definition)
@@ -70,5 +63,48 @@ namespace Ryujinx.Graphics.Shader.StructuredIr
return id;
}
+
+ public static TextureFormat GetTextureFormat(IGpuAccessor gpuAccessor, int handle, int cbufSlot = -1)
+ {
+ // When the formatted load extension is supported, we don't need to
+ // specify a format, we can just declare it without a format and the GPU will handle it.
+ if (gpuAccessor.QueryHostSupportsImageLoadFormatted())
+ {
+ return TextureFormat.Unknown;
+ }
+
+ var format = gpuAccessor.QueryTextureFormat(handle, cbufSlot);
+
+ if (format == TextureFormat.Unknown)
+ {
+ gpuAccessor.Log($"Unknown format for texture {handle}.");
+
+ format = TextureFormat.R8G8B8A8Unorm;
+ }
+
+ return format;
+ }
+
+ private static bool FormatSupportsAtomic(TextureFormat format)
+ {
+ return format == TextureFormat.R32Sint || format == TextureFormat.R32Uint;
+ }
+
+ public static TextureFormat GetTextureFormatAtomic(IGpuAccessor gpuAccessor, int handle, int cbufSlot = -1)
+ {
+ // Atomic image instructions do not support GL_EXT_shader_image_load_formatted,
+ // and must have a type specified. Default to R32Sint if not available.
+
+ var format = gpuAccessor.QueryTextureFormat(handle, cbufSlot);
+
+ if (!FormatSupportsAtomic(format))
+ {
+ gpuAccessor.Log($"Unsupported format for texture {handle}: {format}.");
+
+ format = TextureFormat.R32Sint;
+ }
+
+ return format;
+ }
}
}