Procházet zdrojové kódy

Add support for custom line widths (#2406)

gdkchan před 4 roky
rodič
revize
fefd4619a5

+ 1 - 0
Ryujinx.Graphics.GAL/IPipeline.cs

@@ -52,6 +52,7 @@ namespace Ryujinx.Graphics.GAL
 
         void SetLogicOpState(bool enable, LogicalOp op);
 
+        void SetLineParameters(float width, bool smooth);
         void SetPointParameters(float size, bool isProgramPointSize, bool enablePointSprite, Origin origin);
 
         void SetPrimitiveRestart(bool enable, int index);

+ 18 - 1
Ryujinx.Graphics.Gpu/Engine/Methods.cs

@@ -223,12 +223,17 @@ namespace Ryujinx.Graphics.Gpu.Engine
                 UpdateTexturePoolState(state);
             }
 
-            // Input assembler state.
+            // Rasterizer state.
             if (state.QueryModified(MethodOffset.VertexAttribState))
             {
                 UpdateVertexAttribState(state);
             }
 
+            if (state.QueryModified(MethodOffset.LineWidthSmooth, MethodOffset.LineSmoothEnable))
+            {
+                UpdateLineState(state);
+            }
+
             if (state.QueryModified(MethodOffset.PointSize,
                                     MethodOffset.VertexProgramPointSize,
                                     MethodOffset.PointSpriteEnable,
@@ -716,6 +721,18 @@ namespace Ryujinx.Graphics.Gpu.Engine
             _context.Renderer.Pipeline.SetVertexAttribs(vertexAttribs);
         }
 
+        /// <summary>
+        /// Updates host line width based on guest GPU state.
+        /// </summary>
+        /// <param name="state">Current GPU state</param>
+        private void UpdateLineState(GpuState state)
+        {
+            float width = state.Get<float>(MethodOffset.LineWidthSmooth);
+            bool smooth = state.Get<Boolean32>(MethodOffset.LineSmoothEnable);
+
+            _context.Renderer.Pipeline.SetLineParameters(width, smooth);
+        }
+
         /// <summary>
         /// Updates host point size based on guest GPU state.
         /// </summary>

+ 3 - 0
Ryujinx.Graphics.Gpu/State/MethodOffset.cs

@@ -67,6 +67,8 @@ namespace Ryujinx.Graphics.Gpu.State
         BlendEnable                     = 0x4d8,
         StencilTestState                = 0x4e0,
         YControl                        = 0x4eb,
+        LineWidthSmooth                 = 0x4ec,
+        LineWidthAliased                = 0x4ed,
         FirstVertex                     = 0x50d,
         FirstInstance                   = 0x50e,
         ClipDistanceEnable              = 0x544,
@@ -77,6 +79,7 @@ namespace Ryujinx.Graphics.Gpu.State
         ConditionState                  = 0x554,
         SamplerPoolState                = 0x557,
         DepthBiasFactor                 = 0x55b,
+        LineSmoothEnable                = 0x55c,
         TexturePoolState                = 0x55d,
         StencilBackTestState            = 0x565,
         DepthBiasUnits                  = 0x56f,

+ 14 - 0
Ryujinx.Graphics.OpenGL/Pipeline.cs

@@ -746,6 +746,20 @@ namespace Ryujinx.Graphics.OpenGL
             }
         }
 
+        public void SetLineParameters(float width, bool smooth)
+        {
+            if (smooth)
+            {
+                GL.Enable(EnableCap.LineSmooth);
+            }
+            else
+            {
+                GL.Disable(EnableCap.LineSmooth);
+            }
+
+            GL.LineWidth(width);
+        }
+
         public void SetPointParameters(float size, bool isProgramPointSize, bool enablePointSprite, Origin origin)
         {
             // GL_POINT_SPRITE was deprecated in core profile 3.2+ and causes GL_INVALID_ENUM when set.