mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	renderer: Render previous frame when no new one is available.
This commit is contained in:
		
							parent
							
								
									2adde6ae8b
								
							
						
					
					
						commit
						ebd613c2cc
					
				| @ -12,6 +12,8 @@ | ||||
| #include "core/hle/service/nvdrv/nvdrv_a.h" | ||||
| #include "core/hle/service/vi/vi.h" | ||||
| #include "core/hle/service/vi/vi_m.h" | ||||
| #include "video_core/renderer_base.h" | ||||
| #include "video_core/video_core.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace VI { | ||||
| @ -743,7 +745,8 @@ void NVFlinger::Compose() { | ||||
|         auto buffer = buffer_queue->AcquireBuffer(); | ||||
| 
 | ||||
|         if (buffer == boost::none) { | ||||
|             // There was no queued buffer to draw.
 | ||||
|             // There was no queued buffer to draw, render previous frame
 | ||||
|             VideoCore::g_renderer->SwapBuffers({}); | ||||
|             continue; | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <boost/optional.hpp> | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| @ -47,7 +48,7 @@ public: | ||||
|     virtual ~RendererBase() {} | ||||
| 
 | ||||
|     /// Swap buffers (render frame)
 | ||||
|     virtual void SwapBuffers(const FramebufferInfo& framebuffer_info) = 0; | ||||
|     virtual void SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) = 0; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Set the emulator window to use for renderer | ||||
|  | ||||
| @ -4,8 +4,8 @@ | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <cstddef> | ||||
| #include <cstring> | ||||
| #include <cstdlib> | ||||
| #include <cstring> | ||||
| #include <memory> | ||||
| #include <glad/glad.h> | ||||
| #include "common/assert.h" | ||||
| @ -98,20 +98,23 @@ RendererOpenGL::RendererOpenGL() = default; | ||||
| RendererOpenGL::~RendererOpenGL() = default; | ||||
| 
 | ||||
| /// Swap buffers (render frame)
 | ||||
| void RendererOpenGL::SwapBuffers(const FramebufferInfo& framebuffer_info) { | ||||
| void RendererOpenGL::SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) { | ||||
|     // Maintain the rasterizer's state as a priority
 | ||||
|     OpenGLState prev_state = OpenGLState::GetCurState(); | ||||
|     state.Apply(); | ||||
| 
 | ||||
|     if (screen_info.texture.width != (GLsizei)framebuffer_info.width || | ||||
|         screen_info.texture.height != (GLsizei)framebuffer_info.height || | ||||
|         screen_info.texture.pixel_format != framebuffer_info.pixel_format) { | ||||
|         // Reallocate texture if the framebuffer size has changed.
 | ||||
|         // This is expected to not happen very often and hence should not be a
 | ||||
|         // performance problem.
 | ||||
|         ConfigureFramebufferTexture(screen_info.texture, framebuffer_info); | ||||
|     if (framebuffer_info != boost::none) { | ||||
|         // If framebuffer_info is provided, reload it from memory to a texture
 | ||||
|         if (screen_info.texture.width != (GLsizei)framebuffer_info->width || | ||||
|             screen_info.texture.height != (GLsizei)framebuffer_info->height || | ||||
|             screen_info.texture.pixel_format != framebuffer_info->pixel_format) { | ||||
|             // Reallocate texture if the framebuffer size has changed.
 | ||||
|             // This is expected to not happen very often and hence should not be a
 | ||||
|             // performance problem.
 | ||||
|             ConfigureFramebufferTexture(screen_info.texture, *framebuffer_info); | ||||
|         } | ||||
|         LoadFBToScreenInfo(*framebuffer_info, screen_info); | ||||
|     } | ||||
|     LoadFBToScreenInfo(framebuffer_info, screen_info); | ||||
| 
 | ||||
|     DrawScreens(); | ||||
| 
 | ||||
|  | ||||
| @ -37,7 +37,7 @@ public: | ||||
|     ~RendererOpenGL() override; | ||||
| 
 | ||||
|     /// Swap buffers (render frame)
 | ||||
|     void SwapBuffers(const FramebufferInfo& framebuffer_info) override; | ||||
|     void SwapBuffers(boost::optional<const FramebufferInfo&> framebuffer_info) override; | ||||
| 
 | ||||
|     /**
 | ||||
|      * Set the emulator window to use for renderer | ||||
| @ -53,15 +53,13 @@ public: | ||||
| 
 | ||||
| private: | ||||
|     void InitOpenGLObjects(); | ||||
|     void ConfigureFramebufferTexture(TextureInfo& texture, | ||||
|                                      const FramebufferInfo& framebuffer_info); | ||||
|     void ConfigureFramebufferTexture(TextureInfo& texture, const FramebufferInfo& framebuffer_info); | ||||
|     void DrawScreens(); | ||||
|     void DrawSingleScreen(const ScreenInfo& screen_info, float x, float y, float w, float h); | ||||
|     void UpdateFramerate(); | ||||
| 
 | ||||
|     // Loads framebuffer from emulated memory into the display information structure
 | ||||
|     void LoadFBToScreenInfo(const FramebufferInfo& framebuffer_info, | ||||
|                             ScreenInfo& screen_info); | ||||
|     void LoadFBToScreenInfo(const FramebufferInfo& framebuffer_info, ScreenInfo& screen_info); | ||||
|     // Fills active OpenGL texture with the given RGB color.
 | ||||
|     void LoadColorToActiveGLTexture(u8 color_r, u8 color_g, u8 color_b, const TextureInfo& texture); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei