summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/engines/maxwell_3d.h8
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp10
-rw-r--r--src/video_core/renderer_opengl/gl_state.h16
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp7
4 files changed, 27 insertions, 14 deletions
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h
index 6bf8d0603..42feb0345 100644
--- a/src/video_core/engines/maxwell_3d.h
+++ b/src/video_core/engines/maxwell_3d.h
@@ -1129,24 +1129,30 @@ public:
1129 union { 1129 union {
1130 struct { 1130 struct {
1131 bool null_dirty; 1131 bool null_dirty;
1132
1132 // Vertex Attributes 1133 // Vertex Attributes
1133 bool vertex_attrib_format; 1134 bool vertex_attrib_format;
1135
1134 // Vertex Arrays 1136 // Vertex Arrays
1135 std::array<bool, 32> vertex_array; 1137 std::array<bool, 32> vertex_array;
1136 1138
1137 bool vertex_array_buffers; 1139 bool vertex_array_buffers;
1140
1138 // Vertex Instances 1141 // Vertex Instances
1139 std::array<bool, 32> vertex_instance; 1142 std::array<bool, 32> vertex_instance;
1140 1143
1141 bool vertex_instances; 1144 bool vertex_instances;
1145
1142 // Render Targets 1146 // Render Targets
1143 std::array<bool, 8> render_target; 1147 std::array<bool, 8> render_target;
1144 bool depth_buffer; 1148 bool depth_buffer;
1145 1149
1146 bool render_settings; 1150 bool render_settings;
1151
1147 // Shaders 1152 // Shaders
1148 bool shaders; 1153 bool shaders;
1149 // State 1154
1155 // Rasterizer State
1150 bool viewport; 1156 bool viewport;
1151 bool clip_coefficient; 1157 bool clip_coefficient;
1152 bool cull_mode; 1158 bool cull_mode;
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp
index 2e974c98a..d1ae8a7c5 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp
@@ -1059,7 +1059,7 @@ void RasterizerOpenGL::SyncStencilTestState() {
1059 state.stencil.back.action_depth_fail = GL_KEEP; 1059 state.stencil.back.action_depth_fail = GL_KEEP;
1060 state.stencil.back.action_depth_pass = GL_KEEP; 1060 state.stencil.back.action_depth_pass = GL_KEEP;
1061 } 1061 }
1062 state.MarkDirtyStencilState(true); 1062 state.MarkDirtyStencilState();
1063 maxwell3d.dirty.stencil_test = false; 1063 maxwell3d.dirty.stencil_test = false;
1064} 1064}
1065 1065
@@ -1081,7 +1081,7 @@ void RasterizerOpenGL::SyncColorMask() {
1081 dest.alpha_enabled = (source.A == 0) ? GL_FALSE : GL_TRUE; 1081 dest.alpha_enabled = (source.A == 0) ? GL_FALSE : GL_TRUE;
1082 } 1082 }
1083 1083
1084 state.MarkDirtyColorMask(true); 1084 state.MarkDirtyColorMask();
1085 maxwell3d.dirty.color_mask = false; 1085 maxwell3d.dirty.color_mask = false;
1086} 1086}
1087 1087
@@ -1125,7 +1125,7 @@ void RasterizerOpenGL::SyncBlendState() {
1125 state.blend[i].enabled = false; 1125 state.blend[i].enabled = false;
1126 } 1126 }
1127 maxwell3d.dirty.blend_state = false; 1127 maxwell3d.dirty.blend_state = false;
1128 state.MarkDirtyBlendState(true); 1128 state.MarkDirtyBlendState();
1129 return; 1129 return;
1130 } 1130 }
1131 1131
@@ -1143,7 +1143,7 @@ void RasterizerOpenGL::SyncBlendState() {
1143 blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a); 1143 blend.dst_a_func = MaxwellToGL::BlendFunc(src.factor_dest_a);
1144 } 1144 }
1145 1145
1146 state.MarkDirtyBlendState(true); 1146 state.MarkDirtyBlendState();
1147 maxwell3d.dirty.blend_state = false; 1147 maxwell3d.dirty.blend_state = false;
1148} 1148}
1149 1149
@@ -1209,7 +1209,7 @@ void RasterizerOpenGL::SyncPolygonOffset() {
1209 state.polygon_offset.factor = regs.polygon_offset_factor; 1209 state.polygon_offset.factor = regs.polygon_offset_factor;
1210 state.polygon_offset.clamp = regs.polygon_offset_clamp; 1210 state.polygon_offset.clamp = regs.polygon_offset_clamp;
1211 1211
1212 state.MarkDirtyPolygonOffset(true); 1212 state.MarkDirtyPolygonOffset();
1213 maxwell3d.dirty.polygon_offset = false; 1213 maxwell3d.dirty.polygon_offset = false;
1214} 1214}
1215 1215
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h
index 6a85d15b1..fdf9a8a12 100644
--- a/src/video_core/renderer_opengl/gl_state.h
+++ b/src/video_core/renderer_opengl/gl_state.h
@@ -238,20 +238,20 @@ public:
238 /// Viewport does not affects glClearBuffer so emulate viewport using scissor test 238 /// Viewport does not affects glClearBuffer so emulate viewport using scissor test
239 void EmulateViewportWithScissor(); 239 void EmulateViewportWithScissor();
240 240
241 void MarkDirtyBlendState(const bool is_dirty) { 241 void MarkDirtyBlendState() {
242 dirty.blend_state = is_dirty; 242 dirty.blend_state = true;
243 } 243 }
244 244
245 void MarkDirtyStencilState(const bool is_dirty) { 245 void MarkDirtyStencilState() {
246 dirty.stencil_state = is_dirty; 246 dirty.stencil_state = true;
247 } 247 }
248 248
249 void MarkDirtyPolygonOffset(const bool is_dirty) { 249 void MarkDirtyPolygonOffset() {
250 dirty.polygon_offset = is_dirty; 250 dirty.polygon_offset = true;
251 } 251 }
252 252
253 void MarkDirtyColorMask(const bool is_dirty) { 253 void MarkDirtyColorMask() {
254 dirty.color_mask = is_dirty; 254 dirty.color_mask = true;
255 } 255 }
256 256
257 void AllDirty() { 257 void AllDirty() {
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp
index 9ecdddb0d..a05cef3b9 100644
--- a/src/video_core/renderer_opengl/renderer_opengl.cpp
+++ b/src/video_core/renderer_opengl/renderer_opengl.cpp
@@ -108,6 +108,7 @@ void RendererOpenGL::SwapBuffers(
108 108
109 // Maintain the rasterizer's state as a priority 109 // Maintain the rasterizer's state as a priority
110 OpenGLState prev_state = OpenGLState::GetCurState(); 110 OpenGLState prev_state = OpenGLState::GetCurState();
111 state.AllDirty();
111 state.Apply(); 112 state.Apply();
112 113
113 if (framebuffer) { 114 if (framebuffer) {
@@ -140,6 +141,7 @@ void RendererOpenGL::SwapBuffers(
140 system.GetPerfStats().BeginSystemFrame(); 141 system.GetPerfStats().BeginSystemFrame();
141 142
142 // Restore the rasterizer state 143 // Restore the rasterizer state
144 prev_state.AllDirty();
143 prev_state.Apply(); 145 prev_state.Apply();
144} 146}
145 147
@@ -206,6 +208,7 @@ void RendererOpenGL::InitOpenGLObjects() {
206 // Link shaders and get variable locations 208 // Link shaders and get variable locations
207 shader.CreateFromSource(vertex_shader, nullptr, fragment_shader); 209 shader.CreateFromSource(vertex_shader, nullptr, fragment_shader);
208 state.draw.shader_program = shader.handle; 210 state.draw.shader_program = shader.handle;
211 state.AllDirty();
209 state.Apply(); 212 state.Apply();
210 uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix"); 213 uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix");
211 uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture"); 214 uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture");
@@ -338,12 +341,14 @@ void RendererOpenGL::DrawScreenTriangles(const ScreenInfo& screen_info, float x,
338 // Workaround brigthness problems in SMO by enabling sRGB in the final output 341 // Workaround brigthness problems in SMO by enabling sRGB in the final output
339 // if it has been used in the frame. Needed because of this bug in QT: QTBUG-50987 342 // if it has been used in the frame. Needed because of this bug in QT: QTBUG-50987
340 state.framebuffer_srgb.enabled = OpenGLState::GetsRGBUsed(); 343 state.framebuffer_srgb.enabled = OpenGLState::GetsRGBUsed();
344 state.AllDirty();
341 state.Apply(); 345 state.Apply();
342 glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), vertices.data()); 346 glNamedBufferSubData(vertex_buffer.handle, 0, sizeof(vertices), vertices.data());
343 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 347 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
344 // Restore default state 348 // Restore default state
345 state.framebuffer_srgb.enabled = false; 349 state.framebuffer_srgb.enabled = false;
346 state.texture_units[0].texture = 0; 350 state.texture_units[0].texture = 0;
351 state.AllDirty();
347 state.Apply(); 352 state.Apply();
348 // Clear sRGB state for the next frame 353 // Clear sRGB state for the next frame
349 OpenGLState::ClearsRGBUsed(); 354 OpenGLState::ClearsRGBUsed();
@@ -388,6 +393,7 @@ void RendererOpenGL::CaptureScreenshot() {
388 GLuint old_read_fb = state.draw.read_framebuffer; 393 GLuint old_read_fb = state.draw.read_framebuffer;
389 GLuint old_draw_fb = state.draw.draw_framebuffer; 394 GLuint old_draw_fb = state.draw.draw_framebuffer;
390 state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle; 395 state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle;
396 state.AllDirty();
391 state.Apply(); 397 state.Apply();
392 398
393 Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout}; 399 Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout};
@@ -407,6 +413,7 @@ void RendererOpenGL::CaptureScreenshot() {
407 screenshot_framebuffer.Release(); 413 screenshot_framebuffer.Release();
408 state.draw.read_framebuffer = old_read_fb; 414 state.draw.read_framebuffer = old_read_fb;
409 state.draw.draw_framebuffer = old_draw_fb; 415 state.draw.draw_framebuffer = old_draw_fb;
416 state.AllDirty();
410 state.Apply(); 417 state.Apply();
411 glDeleteRenderbuffers(1, &renderbuffer); 418 glDeleteRenderbuffers(1, &renderbuffer);
412 419