summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-12-26 05:01:43 -0300
committerGravatar ReinUsesLisp2020-02-28 17:52:10 -0300
commit5ccb07933ac0f33d0ecb909d29bf65ee4ab70d8e (patch)
treed055b1d9cfa396a747c8d52023661a1e2cc4b063 /src
parentgl_state: Remove image tracking (diff)
downloadyuzu-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.cpp3
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer.cpp5
-rw-r--r--src/video_core/renderer_opengl/gl_resource_manager.cpp4
-rw-r--r--src/video_core/renderer_opengl/gl_state.cpp35
-rw-r--r--src/video_core/renderer_opengl/gl_state.h8
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp17
-rw-r--r--src/video_core/renderer_opengl/renderer_opengl.cpp33
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
365void RasterizerOpenGL::ConfigureClearFramebuffer(OpenGLState& current_state, bool using_color_fb, 365void 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
391void RasterizerOpenGL::Clear() { 390void 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
26void OGLRenderbuffer::Release() { 26void 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
86OpenGLState::OpenGLState() = default; 86OpenGLState::OpenGLState() = default;
87 87
88void 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
97void OpenGLState::ApplyShaderProgram() { 88void 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
109void OpenGLState::ApplyRenderBuffer() {
110 if (cur_state.renderbuffer != renderbuffer) {
111 cur_state.renderbuffer = renderbuffer;
112 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
113 }
114}
115
116void OpenGLState::Apply() { 100void 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
124OpenGLState& OpenGLState::ResetProgram(GLuint handle) { 106OpenGLState& OpenGLState::ResetProgram(GLuint handle) {
@@ -135,21 +117,4 @@ OpenGLState& OpenGLState::ResetPipeline(GLuint handle) {
135 return *this; 117 return *this;
136} 118}
137 119
138OpenGLState& 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
148OpenGLState& 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 {
14class OpenGLState { 14class OpenGLState {
15public: 15public:
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
46private: 38private:
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}