Przeglądaj źródła

Merge pull request #1411 from ReinUsesLisp/point-size

video_core: Implement point_size and add point state sync
bunnei 7 lat temu
rodzic
commit
fe5962e073

+ 6 - 1
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);

+ 7 - 0
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

+ 3 - 0
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;

+ 7 - 0
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;
 }
 

+ 4 - 0
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<bool, 2> clip_distance; // GL_CLIP_DISTANCE
 
     OpenGLState();