Fernando Sahmkow 7 лет назад
Родитель
Сommit
4be61013a1

+ 7 - 1
src/video_core/engines/maxwell_3d.h

@@ -1129,24 +1129,30 @@ public:
         union {
         union {
             struct {
             struct {
                 bool null_dirty;
                 bool null_dirty;
+
                 // Vertex Attributes
                 // Vertex Attributes
                 bool vertex_attrib_format;
                 bool vertex_attrib_format;
+
                 // Vertex Arrays
                 // Vertex Arrays
                 std::array<bool, 32> vertex_array;
                 std::array<bool, 32> vertex_array;
 
 
                 bool vertex_array_buffers;
                 bool vertex_array_buffers;
+
                 // Vertex Instances
                 // Vertex Instances
                 std::array<bool, 32> vertex_instance;
                 std::array<bool, 32> vertex_instance;
 
 
                 bool vertex_instances;
                 bool vertex_instances;
+
                 // Render Targets
                 // Render Targets
                 std::array<bool, 8> render_target;
                 std::array<bool, 8> render_target;
                 bool depth_buffer;
                 bool depth_buffer;
 
 
                 bool render_settings;
                 bool render_settings;
+
                 // Shaders
                 // Shaders
                 bool shaders;
                 bool shaders;
-                // State
+
+                // Rasterizer State
                 bool viewport;
                 bool viewport;
                 bool clip_coefficient;
                 bool clip_coefficient;
                 bool cull_mode;
                 bool cull_mode;

+ 5 - 5
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -1059,7 +1059,7 @@ void RasterizerOpenGL::SyncStencilTestState() {
         state.stencil.back.action_depth_fail = GL_KEEP;
         state.stencil.back.action_depth_fail = GL_KEEP;
         state.stencil.back.action_depth_pass = GL_KEEP;
         state.stencil.back.action_depth_pass = GL_KEEP;
     }
     }
-    state.MarkDirtyStencilState(true);
+    state.MarkDirtyStencilState();
     maxwell3d.dirty.stencil_test = false;
     maxwell3d.dirty.stencil_test = false;
 }
 }
 
 
@@ -1081,7 +1081,7 @@ void RasterizerOpenGL::SyncColorMask() {
         dest.alpha_enabled = (source.A == 0) ? GL_FALSE : GL_TRUE;
         dest.alpha_enabled = (source.A == 0) ? GL_FALSE : GL_TRUE;
     }
     }
 
 
-    state.MarkDirtyColorMask(true);
+    state.MarkDirtyColorMask();
     maxwell3d.dirty.color_mask = false;
     maxwell3d.dirty.color_mask = false;
 }
 }
 
 
@@ -1125,7 +1125,7 @@ void RasterizerOpenGL::SyncBlendState() {
             state.blend[i].enabled = false;
             state.blend[i].enabled = false;
         }
         }
         maxwell3d.dirty.blend_state = false;
         maxwell3d.dirty.blend_state = false;
-        state.MarkDirtyBlendState(true);
+        state.MarkDirtyBlendState();
         return;
         return;
     }
     }
 
 
@@ -1143,7 +1143,7 @@ void RasterizerOpenGL::SyncBlendState() {
         blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a);
         blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a);
     }
     }
 
 
-    state.MarkDirtyBlendState(true);
+    state.MarkDirtyBlendState();
     maxwell3d.dirty.blend_state = false;
     maxwell3d.dirty.blend_state = false;
 }
 }
 
 
@@ -1209,7 +1209,7 @@ void RasterizerOpenGL::SyncPolygonOffset() {
     state.polygon_offset.factor = regs.polygon_offset_factor;
     state.polygon_offset.factor = regs.polygon_offset_factor;
     state.polygon_offset.clamp = regs.polygon_offset_clamp;
     state.polygon_offset.clamp = regs.polygon_offset_clamp;
 
 
-    state.MarkDirtyPolygonOffset(true);
+    state.MarkDirtyPolygonOffset();
     maxwell3d.dirty.polygon_offset = false;
     maxwell3d.dirty.polygon_offset = false;
 }
 }
 
 

+ 8 - 8
src/video_core/renderer_opengl/gl_state.h

@@ -238,20 +238,20 @@ public:
     /// Viewport does not affects glClearBuffer so emulate viewport using scissor test
     /// Viewport does not affects glClearBuffer so emulate viewport using scissor test
     void EmulateViewportWithScissor();
     void EmulateViewportWithScissor();
 
 
-    void MarkDirtyBlendState(const bool is_dirty) {
-        dirty.blend_state = is_dirty;
+    void MarkDirtyBlendState() {
+        dirty.blend_state = true;
     }
     }
 
 
-    void MarkDirtyStencilState(const bool is_dirty) {
-        dirty.stencil_state = is_dirty;
+    void MarkDirtyStencilState() {
+        dirty.stencil_state = true;
     }
     }
 
 
-    void MarkDirtyPolygonOffset(const bool is_dirty) {
-        dirty.polygon_offset = is_dirty;
+    void MarkDirtyPolygonOffset() {
+        dirty.polygon_offset = true;
     }
     }
 
 
-    void MarkDirtyColorMask(const bool is_dirty) {
-        dirty.color_mask = is_dirty;
+    void MarkDirtyColorMask() {
+        dirty.color_mask = true;
     }
     }
 
 
     void AllDirty() {
     void AllDirty() {

+ 7 - 0
src/video_core/renderer_opengl/renderer_opengl.cpp

@@ -108,6 +108,7 @@ void RendererOpenGL::SwapBuffers(
 
 
     // Maintain the rasterizer's state as a priority
     // Maintain the rasterizer's state as a priority
     OpenGLState prev_state = OpenGLState::GetCurState();
     OpenGLState prev_state = OpenGLState::GetCurState();
+    state.AllDirty();
     state.Apply();
     state.Apply();
 
 
     if (framebuffer) {
     if (framebuffer) {
@@ -140,6 +141,7 @@ void RendererOpenGL::SwapBuffers(
     system.GetPerfStats().BeginSystemFrame();
     system.GetPerfStats().BeginSystemFrame();
 
 
     // Restore the rasterizer state
     // Restore the rasterizer state
+    prev_state.AllDirty();
     prev_state.Apply();
     prev_state.Apply();
 }
 }
 
 
@@ -206,6 +208,7 @@ void RendererOpenGL::InitOpenGLObjects() {
     // Link shaders and get variable locations
     // Link shaders and get variable locations
     shader.CreateFromSource(vertex_shader, nullptr, fragment_shader);
     shader.CreateFromSource(vertex_shader, nullptr, fragment_shader);
     state.draw.shader_program = shader.handle;
     state.draw.shader_program = shader.handle;
+    state.AllDirty();
     state.Apply();
     state.Apply();
     uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix");
     uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix");
     uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture");
     uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture");
@@ -338,12 +341,14 @@ void RendererOpenGL::DrawScreenTriangles(const ScreenInfo& screen_info, float x,
     // Workaround brigthness problems in SMO by enabling sRGB in the final output
     // Workaround brigthness problems in SMO by enabling sRGB in the final output
     // if it has been used in the frame. Needed because of this bug in QT: QTBUG-50987
     // if it has been used in the frame. Needed because of this bug in QT: QTBUG-50987
     state.framebuffer_srgb.enabled = OpenGLState::GetsRGBUsed();
     state.framebuffer_srgb.enabled = OpenGLState::GetsRGBUsed();
+    state.AllDirty();
     state.Apply();
     state.Apply();
     glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), vertices.data());
     glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), vertices.data());
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     // Restore default state
     // Restore default state
     state.framebuffer_srgb.enabled = false;
     state.framebuffer_srgb.enabled = false;
     state.texture_units[0].texture = 0;
     state.texture_units[0].texture = 0;
+    state.AllDirty();
     state.Apply();
     state.Apply();
     // Clear sRGB state for the next frame
     // Clear sRGB state for the next frame
     OpenGLState::ClearsRGBUsed();
     OpenGLState::ClearsRGBUsed();
@@ -388,6 +393,7 @@ void RendererOpenGL::CaptureScreenshot() {
     GLuint old_read_fb = state.draw.read_framebuffer;
     GLuint old_read_fb = state.draw.read_framebuffer;
     GLuint old_draw_fb = state.draw.draw_framebuffer;
     GLuint old_draw_fb = state.draw.draw_framebuffer;
     state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle;
     state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle;
+    state.AllDirty();
     state.Apply();
     state.Apply();
 
 
     Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout};
     Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout};
@@ -407,6 +413,7 @@ void RendererOpenGL::CaptureScreenshot() {
     screenshot_framebuffer.Release();
     screenshot_framebuffer.Release();
     state.draw.read_framebuffer = old_read_fb;
     state.draw.read_framebuffer = old_read_fb;
     state.draw.draw_framebuffer = old_draw_fb;
     state.draw.draw_framebuffer = old_draw_fb;
+    state.AllDirty();
     state.Apply();
     state.Apply();
     glDeleteRenderbuffers(1, &renderbuffer);
     glDeleteRenderbuffers(1, &renderbuffer);