From 5626f2ca1c49342b20772224f956147df6957b5a Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 21 May 2023 14:04:21 -0300 Subject: Replace ShaderBindings with new ResourceLayout structure for Vulkan (#5025) * Introduce ResourceLayout * Part 1: Use new ResourceSegments array on UpdateAndBind * Part 2: Use ResourceLayout to build PipelineLayout * Delete old code * XML docs * Fix shader cache load NRE * Fix typo --- src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs | 34 +++++++------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs') diff --git a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs index d543f42a..b7ba159a 100644 --- a/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs +++ b/src/Ryujinx.Graphics.Gpu/Shader/ShaderCache.cs @@ -219,12 +219,11 @@ namespace Ryujinx.Graphics.Gpu.Shader GpuAccessor gpuAccessor = new GpuAccessor(_context, channel, gpuAccessorState); TranslatorContext translatorContext = DecodeComputeShader(gpuAccessor, _context.Capabilities.Api, gpuVa); - TranslatedShader translatedShader = TranslateShader(_dumper, channel, translatorContext, cachedGuestCode); ShaderSource[] shaderSourcesArray = new ShaderSource[] { CreateShaderSource(translatedShader.Program) }; - - IProgram hostProgram = _context.Renderer.CreateProgram(shaderSourcesArray, new ShaderInfo(-1)); + ShaderInfo info = ShaderInfoBuilder.BuildForCompute(_context, translatedShader.Program.Info); + IProgram hostProgram = _context.Renderer.CreateProgram(shaderSourcesArray, info); cpShader = new CachedShaderProgram(hostProgram, specState, translatedShader.Shader); @@ -363,6 +362,8 @@ namespace Ryujinx.Graphics.Gpu.Shader TranslatorContext previousStage = null; + ShaderInfoBuilder infoBuilder = new ShaderInfoBuilder(_context); + for (int stageIndex = 0; stageIndex < Constants.ShaderStages; stageIndex++) { TranslatorContext currentStage = translatorContexts[stageIndex + 1]; @@ -398,6 +399,7 @@ namespace Ryujinx.Graphics.Gpu.Shader if (program != null) { shaderSources.Add(CreateShaderSource(program)); + infoBuilder.AddStageInfo(program.Info); } previousStage = currentStage; @@ -414,8 +416,9 @@ namespace Ryujinx.Graphics.Gpu.Shader ShaderSource[] shaderSourcesArray = shaderSources.ToArray(); - int fragmentOutputMap = shaders[5]?.Info.FragmentOutputMap ?? -1; - IProgram hostProgram = _context.Renderer.CreateProgram(shaderSourcesArray, new ShaderInfo(fragmentOutputMap, pipeline)); + ShaderInfo info = infoBuilder.Build(pipeline); + + IProgram hostProgram = _context.Renderer.CreateProgram(shaderSourcesArray, info); gpShaders = new CachedShaderProgram(hostProgram, specState, shaders); @@ -466,7 +469,7 @@ namespace Ryujinx.Graphics.Gpu.Shader /// Shader source public static ShaderSource CreateShaderSource(ShaderProgram program) { - return new ShaderSource(program.Code, program.BinaryCode, GetBindings(program.Info), program.Info.Stage, program.Language); + return new ShaderSource(program.Code, program.BinaryCode, program.Info.Stage, program.Language); } /// @@ -717,25 +720,6 @@ namespace Ryujinx.Graphics.Gpu.Shader }; } - /// - /// Gets information about the bindings used by a shader program. - /// - /// Shader program information to get the information from - /// Shader bindings - public static ShaderBindings GetBindings(ShaderProgramInfo info) - { - var uniformBufferBindings = info.CBuffers.Select(x => x.Binding).ToArray(); - var storageBufferBindings = info.SBuffers.Select(x => x.Binding).ToArray(); - var textureBindings = info.Textures.Select(x => x.Binding).ToArray(); - var imageBindings = info.Images.Select(x => x.Binding).ToArray(); - - return new ShaderBindings( - uniformBufferBindings, - storageBufferBindings, - textureBindings, - imageBindings); - } - /// /// Creates shader translation options with the requested graphics API and flags. /// The shader language is choosen based on the current configuration and graphics API. -- cgit v1.2.3