diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index cd26c7216c..9f55810458 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -642,7 +642,11 @@ public: u32 vb_element_base; - INSERT_PADDING_WORDS(0x40); + INSERT_PADDING_WORDS(0x38); + + float point_size; + + INSERT_PADDING_WORDS(0x7); u32 zeta_enable; @@ -1018,6 +1022,7 @@ ASSERT_REG_POSITION(stencil_front_func_mask, 0x4E6); ASSERT_REG_POSITION(stencil_front_mask, 0x4E7); ASSERT_REG_POSITION(screen_y_control, 0x4EB); ASSERT_REG_POSITION(vb_element_base, 0x50D); +ASSERT_REG_POSITION(point_size, 0x546); ASSERT_REG_POSITION(zeta_enable, 0x54E); ASSERT_REG_POSITION(tsc, 0x557); ASSERT_REG_POSITION(tic, 0x55D); diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 44850d193c..1fcd13f048 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -452,6 +452,7 @@ void RasterizerOpenGL::DrawArrays() { SyncCullMode(); SyncAlphaTest(); SyncTransformFeedback(); + SyncPointState(); // TODO(bunnei): Sync framebuffer_scale uniform here // TODO(bunnei): Sync scissorbox uniform(s) here @@ -905,4 +906,10 @@ void RasterizerOpenGL::SyncTransformFeedback() { } } +void RasterizerOpenGL::SyncPointState() { + const auto& regs = Core::System::GetInstance().GPU().Maxwell3D().regs; + + state.point.size = regs.point_size; +} + } // namespace OpenGL diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index b64c93b81f..4c8ecbd1c1 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -164,6 +164,9 @@ private: /// Syncs the transform feedback state to match the guest state void SyncTransformFeedback(); + /// Syncs the point state to match the guest state + void SyncPointState(); + bool has_ARB_direct_state_access = false; bool has_ARB_multi_bind = false; bool has_ARB_separate_shader_objects = false; diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp index e494b3f161..1fe26a2a9a 100644 --- a/src/video_core/renderer_opengl/gl_state.cpp +++ b/src/video_core/renderer_opengl/gl_state.cpp @@ -79,6 +79,8 @@ OpenGLState::OpenGLState() { viewport.height = 0; clip_distance = {}; + + point.size = 1; } void OpenGLState::Apply() const { @@ -301,6 +303,11 @@ void OpenGLState::Apply() const { } } + // Point + if (point.size != cur_state.point.size) { + glPointSize(point.size); + } + cur_state = *this; } diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index 49f30b1112..dc21a2ee3a 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h @@ -142,6 +142,10 @@ public: GLsizei height; } viewport; + struct { + float size; // GL_POINT_SIZE + } point; + std::array clip_distance; // GL_CLIP_DISTANCE OpenGLState();