diff --git a/Ryujinx.Graphics.GAL/IPipeline.cs b/Ryujinx.Graphics.GAL/IPipeline.cs index bb3a8dcac9..760ad2edc9 100644 --- a/Ryujinx.Graphics.GAL/IPipeline.cs +++ b/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); diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs index 39b3d13c40..96741cd6ca 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs +++ b/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); } + /// + /// Updates host line width based on guest GPU state. + /// + /// Current GPU state + private void UpdateLineState(GpuState state) + { + float width = state.Get(MethodOffset.LineWidthSmooth); + bool smooth = state.Get(MethodOffset.LineSmoothEnable); + + _context.Renderer.Pipeline.SetLineParameters(width, smooth); + } + /// /// Updates host point size based on guest GPU state. /// diff --git a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs b/Ryujinx.Graphics.Gpu/State/MethodOffset.cs index 4504e6b140..1ddef95cb4 100644 --- a/Ryujinx.Graphics.Gpu/State/MethodOffset.cs +++ b/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, diff --git a/Ryujinx.Graphics.OpenGL/Pipeline.cs b/Ryujinx.Graphics.OpenGL/Pipeline.cs index a651dc750e..948a8b891b 100644 --- a/Ryujinx.Graphics.OpenGL/Pipeline.cs +++ b/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.