diff options
| author | 2019-12-26 05:01:43 -0300 | |
|---|---|---|
| committer | 2020-02-28 17:52:10 -0300 | |
| commit | 5ccb07933ac0f33d0ecb909d29bf65ee4ab70d8e (patch) | |
| tree | d055b1d9cfa396a747c8d52023661a1e2cc4b063 /src | |
| parent | gl_state: Remove image tracking (diff) | |
| download | yuzu-5ccb07933ac0f33d0ecb909d29bf65ee4ab70d8e.tar.gz yuzu-5ccb07933ac0f33d0ecb909d29bf65ee4ab70d8e.tar.xz yuzu-5ccb07933ac0f33d0ecb909d29bf65ee4ab70d8e.zip | |
gl_state: Remove framebuffer tracking
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_framebuffer_cache.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_resource_manager.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.cpp | 35 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_state.h | 8 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 17 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 33 |
7 files changed, 23 insertions, 82 deletions
diff --git a/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp b/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp index 874ed3c6e..d624a6272 100644 --- a/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_framebuffer_cache.cpp | |||
| @@ -36,8 +36,7 @@ OGLFramebuffer FramebufferCacheOpenGL::CreateFramebuffer(const FramebufferCacheK | |||
| 36 | framebuffer.Create(); | 36 | framebuffer.Create(); |
| 37 | 37 | ||
| 38 | // TODO(Rodrigo): Use DSA here after Nvidia fixes their framebuffer DSA bugs. | 38 | // TODO(Rodrigo): Use DSA here after Nvidia fixes their framebuffer DSA bugs. |
| 39 | local_state.draw.draw_framebuffer = framebuffer.handle; | 39 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer.handle); |
| 40 | local_state.ApplyFramebufferState(); | ||
| 41 | 40 | ||
| 42 | if (key.zeta) { | 41 | if (key.zeta) { |
| 43 | const bool stencil = key.zeta->GetSurfaceParams().type == SurfaceType::DepthStencil; | 42 | const bool stencil = key.zeta->GetSurfaceParams().type == SurfaceType::DepthStencil; |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 1f94f759d..b826146fb 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -359,7 +359,7 @@ void RasterizerOpenGL::ConfigureFramebuffers() { | |||
| 359 | 359 | ||
| 360 | texture_cache.GuardRenderTargets(false); | 360 | texture_cache.GuardRenderTargets(false); |
| 361 | 361 | ||
| 362 | state.draw.draw_framebuffer = framebuffer_cache.GetFramebuffer(key); | 362 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_cache.GetFramebuffer(key)); |
| 363 | } | 363 | } |
| 364 | 364 | ||
| 365 | void RasterizerOpenGL::ConfigureClearFramebuffer(OpenGLState& current_state, bool using_color_fb, | 365 | void RasterizerOpenGL::ConfigureClearFramebuffer(OpenGLState& current_state, bool using_color_fb, |
| @@ -384,8 +384,7 @@ void RasterizerOpenGL::ConfigureClearFramebuffer(OpenGLState& current_state, boo | |||
| 384 | key.colors[0] = color_surface; | 384 | key.colors[0] = color_surface; |
| 385 | key.zeta = depth_surface; | 385 | key.zeta = depth_surface; |
| 386 | 386 | ||
| 387 | current_state.draw.draw_framebuffer = framebuffer_cache.GetFramebuffer(key); | 387 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer_cache.GetFramebuffer(key)); |
| 388 | current_state.ApplyFramebufferState(); | ||
| 389 | } | 388 | } |
| 390 | 389 | ||
| 391 | void RasterizerOpenGL::Clear() { | 390 | void RasterizerOpenGL::Clear() { |
diff --git a/src/video_core/renderer_opengl/gl_resource_manager.cpp b/src/video_core/renderer_opengl/gl_resource_manager.cpp index 80666a9ed..21ea6fde4 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.cpp +++ b/src/video_core/renderer_opengl/gl_resource_manager.cpp | |||
| @@ -20,7 +20,7 @@ void OGLRenderbuffer::Create() { | |||
| 20 | return; | 20 | return; |
| 21 | 21 | ||
| 22 | MICROPROFILE_SCOPE(OpenGL_ResourceCreation); | 22 | MICROPROFILE_SCOPE(OpenGL_ResourceCreation); |
| 23 | glGenRenderbuffers(1, &handle); | 23 | glCreateRenderbuffers(1, &handle); |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | void OGLRenderbuffer::Release() { | 26 | void OGLRenderbuffer::Release() { |
| @@ -29,7 +29,6 @@ void OGLRenderbuffer::Release() { | |||
| 29 | 29 | ||
| 30 | MICROPROFILE_SCOPE(OpenGL_ResourceDeletion); | 30 | MICROPROFILE_SCOPE(OpenGL_ResourceDeletion); |
| 31 | glDeleteRenderbuffers(1, &handle); | 31 | glDeleteRenderbuffers(1, &handle); |
| 32 | OpenGLState::GetCurState().ResetRenderbuffer(handle).Apply(); | ||
| 33 | handle = 0; | 32 | handle = 0; |
| 34 | } | 33 | } |
| 35 | 34 | ||
| @@ -200,7 +199,6 @@ void OGLFramebuffer::Release() { | |||
| 200 | 199 | ||
| 201 | MICROPROFILE_SCOPE(OpenGL_ResourceDeletion); | 200 | MICROPROFILE_SCOPE(OpenGL_ResourceDeletion); |
| 202 | glDeleteFramebuffers(1, &handle); | 201 | glDeleteFramebuffers(1, &handle); |
| 203 | OpenGLState::GetCurState().ResetFramebuffer(handle).Apply(); | ||
| 204 | handle = 0; | 202 | handle = 0; |
| 205 | } | 203 | } |
| 206 | 204 | ||
diff --git a/src/video_core/renderer_opengl/gl_state.cpp b/src/video_core/renderer_opengl/gl_state.cpp index 7bb87f7ba..be4ca6bf0 100644 --- a/src/video_core/renderer_opengl/gl_state.cpp +++ b/src/video_core/renderer_opengl/gl_state.cpp | |||
| @@ -85,15 +85,6 @@ void Enable(GLenum cap, GLuint index, bool& current_value, bool new_value) { | |||
| 85 | 85 | ||
| 86 | OpenGLState::OpenGLState() = default; | 86 | OpenGLState::OpenGLState() = default; |
| 87 | 87 | ||
| 88 | void OpenGLState::ApplyFramebufferState() { | ||
| 89 | if (UpdateValue(cur_state.draw.read_framebuffer, draw.read_framebuffer)) { | ||
| 90 | glBindFramebuffer(GL_READ_FRAMEBUFFER, draw.read_framebuffer); | ||
| 91 | } | ||
| 92 | if (UpdateValue(cur_state.draw.draw_framebuffer, draw.draw_framebuffer)) { | ||
| 93 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, draw.draw_framebuffer); | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | void OpenGLState::ApplyShaderProgram() { | 88 | void OpenGLState::ApplyShaderProgram() { |
| 98 | if (UpdateValue(cur_state.draw.shader_program, draw.shader_program)) { | 89 | if (UpdateValue(cur_state.draw.shader_program, draw.shader_program)) { |
| 99 | glUseProgram(draw.shader_program); | 90 | glUseProgram(draw.shader_program); |
| @@ -106,19 +97,10 @@ void OpenGLState::ApplyProgramPipeline() { | |||
| 106 | } | 97 | } |
| 107 | } | 98 | } |
| 108 | 99 | ||
| 109 | void OpenGLState::ApplyRenderBuffer() { | ||
| 110 | if (cur_state.renderbuffer != renderbuffer) { | ||
| 111 | cur_state.renderbuffer = renderbuffer; | ||
| 112 | glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); | ||
| 113 | } | ||
| 114 | } | ||
| 115 | |||
| 116 | void OpenGLState::Apply() { | 100 | void OpenGLState::Apply() { |
| 117 | MICROPROFILE_SCOPE(OpenGL_State); | 101 | MICROPROFILE_SCOPE(OpenGL_State); |
| 118 | ApplyFramebufferState(); | ||
| 119 | ApplyShaderProgram(); | 102 | ApplyShaderProgram(); |
| 120 | ApplyProgramPipeline(); | 103 | ApplyProgramPipeline(); |
| 121 | ApplyRenderBuffer(); | ||
| 122 | } | 104 | } |
| 123 | 105 | ||
| 124 | OpenGLState& OpenGLState::ResetProgram(GLuint handle) { | 106 | OpenGLState& OpenGLState::ResetProgram(GLuint handle) { |
| @@ -135,21 +117,4 @@ OpenGLState& OpenGLState::ResetPipeline(GLuint handle) { | |||
| 135 | return *this; | 117 | return *this; |
| 136 | } | 118 | } |
| 137 | 119 | ||
| 138 | OpenGLState& OpenGLState::ResetFramebuffer(GLuint handle) { | ||
| 139 | if (draw.read_framebuffer == handle) { | ||
| 140 | draw.read_framebuffer = 0; | ||
| 141 | } | ||
| 142 | if (draw.draw_framebuffer == handle) { | ||
| 143 | draw.draw_framebuffer = 0; | ||
| 144 | } | ||
| 145 | return *this; | ||
| 146 | } | ||
| 147 | |||
| 148 | OpenGLState& OpenGLState::ResetRenderbuffer(GLuint handle) { | ||
| 149 | if (renderbuffer == handle) { | ||
| 150 | renderbuffer = 0; | ||
| 151 | } | ||
| 152 | return *this; | ||
| 153 | } | ||
| 154 | |||
| 155 | } // namespace OpenGL | 120 | } // namespace OpenGL |
diff --git a/src/video_core/renderer_opengl/gl_state.h b/src/video_core/renderer_opengl/gl_state.h index 4e34fcfc2..c9a839736 100644 --- a/src/video_core/renderer_opengl/gl_state.h +++ b/src/video_core/renderer_opengl/gl_state.h | |||
| @@ -14,14 +14,10 @@ namespace OpenGL { | |||
| 14 | class OpenGLState { | 14 | class OpenGLState { |
| 15 | public: | 15 | public: |
| 16 | struct { | 16 | struct { |
| 17 | GLuint read_framebuffer = 0; // GL_READ_FRAMEBUFFER_BINDING | ||
| 18 | GLuint draw_framebuffer = 0; // GL_DRAW_FRAMEBUFFER_BINDING | ||
| 19 | GLuint shader_program = 0; // GL_CURRENT_PROGRAM | 17 | GLuint shader_program = 0; // GL_CURRENT_PROGRAM |
| 20 | GLuint program_pipeline = 0; // GL_PROGRAM_PIPELINE_BINDING | 18 | GLuint program_pipeline = 0; // GL_PROGRAM_PIPELINE_BINDING |
| 21 | } draw; | 19 | } draw; |
| 22 | 20 | ||
| 23 | GLuint renderbuffer{}; // GL_RENDERBUFFER_BINDING | ||
| 24 | |||
| 25 | OpenGLState(); | 21 | OpenGLState(); |
| 26 | 22 | ||
| 27 | /// Get the currently active OpenGL state | 23 | /// Get the currently active OpenGL state |
| @@ -32,16 +28,12 @@ public: | |||
| 32 | /// Apply this state as the current OpenGL state | 28 | /// Apply this state as the current OpenGL state |
| 33 | void Apply(); | 29 | void Apply(); |
| 34 | 30 | ||
| 35 | void ApplyFramebufferState(); | ||
| 36 | void ApplyShaderProgram(); | 31 | void ApplyShaderProgram(); |
| 37 | void ApplyProgramPipeline(); | 32 | void ApplyProgramPipeline(); |
| 38 | void ApplyRenderBuffer(); | ||
| 39 | 33 | ||
| 40 | /// Resets any references to the given resource | 34 | /// Resets any references to the given resource |
| 41 | OpenGLState& ResetProgram(GLuint handle); | 35 | OpenGLState& ResetProgram(GLuint handle); |
| 42 | OpenGLState& ResetPipeline(GLuint handle); | 36 | OpenGLState& ResetPipeline(GLuint handle); |
| 43 | OpenGLState& ResetFramebuffer(GLuint handle); | ||
| 44 | OpenGLState& ResetRenderbuffer(GLuint handle); | ||
| 45 | 37 | ||
| 46 | private: | 38 | private: |
| 47 | static OpenGLState cur_state; | 39 | static OpenGLState cur_state; |
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index ca407c1b3..5fe6aa5d6 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -515,14 +515,8 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view, | |||
| 515 | const Tegra::Engines::Fermi2D::Config& copy_config) { | 515 | const Tegra::Engines::Fermi2D::Config& copy_config) { |
| 516 | const auto& src_params{src_view->GetSurfaceParams()}; | 516 | const auto& src_params{src_view->GetSurfaceParams()}; |
| 517 | const auto& dst_params{dst_view->GetSurfaceParams()}; | 517 | const auto& dst_params{dst_view->GetSurfaceParams()}; |
| 518 | 518 | UNIMPLEMENTED_IF(src_params.target == SurfaceTarget::Texture3D); | |
| 519 | OpenGLState prev_state{OpenGLState::GetCurState()}; | 519 | UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D); |
| 520 | SCOPE_EXIT({ prev_state.Apply(); }); | ||
| 521 | |||
| 522 | OpenGLState state; | ||
| 523 | state.draw.read_framebuffer = src_framebuffer.handle; | ||
| 524 | state.draw.draw_framebuffer = dst_framebuffer.handle; | ||
| 525 | state.Apply(); | ||
| 526 | 520 | ||
| 527 | // TODO: Signal state tracker about these changes | 521 | // TODO: Signal state tracker about these changes |
| 528 | if (dst_params.srgb_conversion) { | 522 | if (dst_params.srgb_conversion) { |
| @@ -538,11 +532,10 @@ void TextureCacheOpenGL::ImageBlit(View& src_view, View& dst_view, | |||
| 538 | glDisablei(GL_BLEND, 0); | 532 | glDisablei(GL_BLEND, 0); |
| 539 | glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); | 533 | glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE); |
| 540 | 534 | ||
| 541 | u32 buffers{}; | 535 | glBindFramebuffer(GL_READ_FRAMEBUFFER, src_framebuffer.handle); |
| 542 | 536 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dst_framebuffer.handle); | |
| 543 | UNIMPLEMENTED_IF(src_params.target == SurfaceTarget::Texture3D); | ||
| 544 | UNIMPLEMENTED_IF(dst_params.target == SurfaceTarget::Texture3D); | ||
| 545 | 537 | ||
| 538 | GLenum buffers = 0; | ||
| 546 | if (src_params.type == SurfaceType::ColorTexture) { | 539 | if (src_params.type == SurfaceType::ColorTexture) { |
| 547 | src_view->Attach(GL_COLOR_ATTACHMENT0, GL_READ_FRAMEBUFFER); | 540 | src_view->Attach(GL_COLOR_ATTACHMENT0, GL_READ_FRAMEBUFFER); |
| 548 | glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, | 541 | glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 1295121f5..da4b4bf34 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -86,28 +86,22 @@ public: | |||
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | void ReloadRenderFrame(Frame* frame, u32 width, u32 height) { | 88 | void ReloadRenderFrame(Frame* frame, u32 width, u32 height) { |
| 89 | OpenGLState prev_state = OpenGLState::GetCurState(); | ||
| 90 | OpenGLState state = OpenGLState::GetCurState(); | ||
| 91 | |||
| 92 | // Recreate the color texture attachment | 89 | // Recreate the color texture attachment |
| 93 | frame->color.Release(); | 90 | frame->color.Release(); |
| 94 | frame->color.Create(); | 91 | frame->color.Create(); |
| 95 | state.renderbuffer = frame->color.handle; | 92 | const GLenum internal_format = frame->is_srgb ? GL_SRGB8 : GL_RGB8; |
| 96 | state.Apply(); | 93 | glNamedRenderbufferStorage(frame->color.handle, internal_format, width, height); |
| 97 | glRenderbufferStorage(GL_RENDERBUFFER, frame->is_srgb ? GL_SRGB8 : GL_RGB8, width, height); | ||
| 98 | 94 | ||
| 99 | // Recreate the FBO for the render target | 95 | // Recreate the FBO for the render target |
| 100 | frame->render.Release(); | 96 | frame->render.Release(); |
| 101 | frame->render.Create(); | 97 | frame->render.Create(); |
| 102 | state.draw.read_framebuffer = frame->render.handle; | 98 | glBindFramebuffer(GL_FRAMEBUFFER, frame->render.handle); |
| 103 | state.draw.draw_framebuffer = frame->render.handle; | ||
| 104 | state.Apply(); | ||
| 105 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, | 99 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, |
| 106 | frame->color.handle); | 100 | frame->color.handle); |
| 107 | if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { | 101 | if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { |
| 108 | LOG_CRITICAL(Render_OpenGL, "Failed to recreate render FBO!"); | 102 | LOG_CRITICAL(Render_OpenGL, "Failed to recreate render FBO!"); |
| 109 | } | 103 | } |
| 110 | prev_state.Apply(); | 104 | |
| 111 | frame->width = width; | 105 | frame->width = width; |
| 112 | frame->height = height; | 106 | frame->height = height; |
| 113 | frame->color_reloaded = true; | 107 | frame->color_reloaded = true; |
| @@ -353,8 +347,7 @@ void RendererOpenGL::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { | |||
| 353 | frame->is_srgb = screen_info.display_srgb; | 347 | frame->is_srgb = screen_info.display_srgb; |
| 354 | frame_mailbox->ReloadRenderFrame(frame, layout.width, layout.height); | 348 | frame_mailbox->ReloadRenderFrame(frame, layout.width, layout.height); |
| 355 | } | 349 | } |
| 356 | state.draw.draw_framebuffer = frame->render.handle; | 350 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frame->render.handle); |
| 357 | state.Apply(); | ||
| 358 | DrawScreen(layout); | 351 | DrawScreen(layout); |
| 359 | // Create a fence for the frontend to wait on and swap this frame to OffTex | 352 | // Create a fence for the frontend to wait on and swap this frame to OffTex |
| 360 | frame->render_fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); | 353 | frame->render_fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
| @@ -647,12 +640,14 @@ void RendererOpenGL::RenderScreenshot() { | |||
| 647 | return; | 640 | return; |
| 648 | } | 641 | } |
| 649 | 642 | ||
| 643 | GLint old_read_fb; | ||
| 644 | GLint old_draw_fb; | ||
| 645 | glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &old_read_fb); | ||
| 646 | glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &old_draw_fb); | ||
| 647 | |||
| 650 | // Draw the current frame to the screenshot framebuffer | 648 | // Draw the current frame to the screenshot framebuffer |
| 651 | screenshot_framebuffer.Create(); | 649 | screenshot_framebuffer.Create(); |
| 652 | GLuint old_read_fb = state.draw.read_framebuffer; | 650 | glBindFramebuffer(GL_FRAMEBUFFER, screenshot_framebuffer.handle); |
| 653 | GLuint old_draw_fb = state.draw.draw_framebuffer; | ||
| 654 | state.draw.read_framebuffer = state.draw.draw_framebuffer = screenshot_framebuffer.handle; | ||
| 655 | state.Apply(); | ||
| 656 | 651 | ||
| 657 | Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout}; | 652 | Layout::FramebufferLayout layout{renderer_settings.screenshot_framebuffer_layout}; |
| 658 | 653 | ||
| @@ -669,11 +664,11 @@ void RendererOpenGL::RenderScreenshot() { | |||
| 669 | renderer_settings.screenshot_bits); | 664 | renderer_settings.screenshot_bits); |
| 670 | 665 | ||
| 671 | screenshot_framebuffer.Release(); | 666 | screenshot_framebuffer.Release(); |
| 672 | state.draw.read_framebuffer = old_read_fb; | ||
| 673 | state.draw.draw_framebuffer = old_draw_fb; | ||
| 674 | state.Apply(); | ||
| 675 | glDeleteRenderbuffers(1, &renderbuffer); | 667 | glDeleteRenderbuffers(1, &renderbuffer); |
| 676 | 668 | ||
| 669 | glBindFramebuffer(GL_READ_FRAMEBUFFER, old_read_fb); | ||
| 670 | glBindFramebuffer(GL_DRAW_FRAMEBUFFER, old_draw_fb); | ||
| 671 | |||
| 677 | renderer_settings.screenshot_complete_callback(); | 672 | renderer_settings.screenshot_complete_callback(); |
| 678 | renderer_settings.screenshot_requested = false; | 673 | renderer_settings.screenshot_requested = false; |
| 679 | } | 674 | } |