diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 10 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 16 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 7 |
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 | ||