فهرست منبع

Ensure render scale is initialized to 1 on the backend (#2543)

gdkchan 4 سال پیش
والد
کامیت
0ba4ade8f1
3فایلهای تغییر یافته به همراه13 افزوده شده و 9 حذف شده
  1. 11 8
      Ryujinx.Graphics.OpenGL/Pipeline.cs
  2. 1 0
      Ryujinx.Graphics.OpenGL/Renderer.cs
  3. 1 1
      Ryujinx.Graphics.Shader/SupportBuffer.cs

+ 11 - 8
Ryujinx.Graphics.OpenGL/Pipeline.cs

@@ -76,13 +76,22 @@ namespace Ryujinx.Graphics.OpenGL
                 _componentMasks[index] = 0xf;
             }
 
-            var v4Zero = new Vector4<float> { X = 0f, Y = 0f, Z = 0f, W = 0f };
-            new Span<Vector4<float>>(_renderScale).Fill(v4Zero);
+            var defaultScale = new Vector4<float> { X = 1f, Y = 0f, Z = 0f, W = 0f };
+            new Span<Vector4<float>>(_renderScale).Fill(defaultScale);
 
             _tfbs = new BufferHandle[Constants.MaxTransformFeedbackBuffers];
             _tfbTargets = new BufferRange[Constants.MaxTransformFeedbackBuffers];
         }
 
+        public void Initialize()
+        {
+            _supportBuffer = Buffer.Create(SupportBuffer.RequiredSize);
+            GL.BindBufferBase(BufferRangeTarget.UniformBuffer, 0, Unsafe.As<BufferHandle, int>(ref _supportBuffer));
+
+            SetSupportBufferData<Vector4<int>>(SupportBuffer.FragmentIsBgraOffset, _fpIsBgra, SupportBuffer.FragmentIsBgraCount);
+            SetSupportBufferData<Vector4<float>>(SupportBuffer.FragmentRenderScaleOffset, _renderScale, SupportBuffer.RenderScaleMaxCount);
+        }
+
         public void Barrier()
         {
             GL.MemoryBarrier(MemoryBarrierFlags.AllBarrierBits);
@@ -1207,12 +1216,6 @@ namespace Ryujinx.Graphics.OpenGL
 
         private void SetSupportBufferData<T>(int offset, ReadOnlySpan<T> data, int count) where T : unmanaged
         {
-            if (_supportBuffer == BufferHandle.Null)
-            {
-                _supportBuffer = Buffer.Create(SupportBuffer.RequiredSize);
-                GL.BindBufferBase(BufferRangeTarget.UniformBuffer, 0, Unsafe.As<BufferHandle, int>(ref _supportBuffer));
-            }
-
             Buffer.SetData(_supportBuffer, offset, MemoryMarshal.Cast<T, byte>(data.Slice(0, count)));
         }
 

+ 1 - 0
Ryujinx.Graphics.OpenGL/Renderer.cs

@@ -144,6 +144,7 @@ namespace Ryujinx.Graphics.OpenGL
                 GL.Arb.MaxShaderCompilerThreads(Math.Min(Environment.ProcessorCount, 8));
             }
 
+            _pipeline.Initialize();
             _counters.Initialize();
         }
 

+ 1 - 1
Ryujinx.Graphics.Shader/SupportBuffer.cs

@@ -11,7 +11,7 @@ namespace Ryujinx.Graphics.Shader
         public const int ComputeRenderScaleOffset = FragmentRenderScaleOffset + FieldSize; // Skip first scale that is used for the render target
 
         // One for the render target, 32 for the textures, and 8 for the images.
-        private const int RenderScaleMaxCount = 1 + 32 + 8;
+        public const int RenderScaleMaxCount = 1 + 32 + 8;
 
         public const int RequiredSize = FragmentRenderScaleOffset + RenderScaleMaxCount * FieldSize;
     }