diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-08-13 22:26:42 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-13 22:26:42 -0300 |
commit | b423197619dd8d9dda1c255a76105bf30e255dae (patch) | |
tree | e3898b3b1672f022b5de4522b51bd21583043996 /src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs | |
parent | 8edfb2bc7b8507d0ef51f0544eb32a65f0bf54a1 (diff) |
Delete ShaderConfig and organize shader resources/definitions better (#5509)1.1.985
* Move some properties out of ShaderConfig
* Stop using ShaderConfig on backends
* Replace ShaderConfig usages on Translator and passes
* Move remaining properties out of ShaderConfig and delete ShaderConfig
* Remove ResourceManager property from TranslatorContext
* Move Rewriter passes to separate transform pass files
* Fix TransformPasses.RunPass on cases where a node is removed
* Move remaining ClipDistancePrimitivesWritten and UsedFeatures updates to decode stage
* Reduce excessive parameter passing a bit by using structs more
* Remove binding parameter from ShaderProperties methods since it is redundant
* Replace decoder instruction checks with switch statement
* Put GLSL on the same plan as SPIR-V for input/output declaration
* Stop mutating TranslatorContext state when Translate is called
* Pass most of the graphics state using a struct instead of individual query methods
* Auto-format
* Auto-format
* Add backend logging interface
* Auto-format
* Remove unnecessary use of interpolated strings
* Remove more modifications of AttributeUsage after decode
* PR feedback
* gl_Layer is not supported on compute
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/StructuredIr/ShaderProperties.cs | 66 |
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; + } } } |