diff options
| author | 2018-03-23 15:49:04 -0400 | |
|---|---|---|
| committer | 2018-03-23 15:49:04 -0400 | |
| commit | 054393917e99d307eea0aabc78c0c6e5e709b2c7 (patch) | |
| tree | 9e497f01b4cbb18deb1e7afc9979954b60ee848b /src | |
| parent | memory: Fix typo in RasterizerFlushVirtualRegion. (diff) | |
| download | yuzu-054393917e99d307eea0aabc78c0c6e5e709b2c7.tar.gz yuzu-054393917e99d307eea0aabc78c0c6e5e709b2c7.tar.xz yuzu-054393917e99d307eea0aabc78c0c6e5e709b2c7.zip | |
renderer_opengl: Fixes for properly flushing & rendering the framebuffer.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 18 |
2 files changed, 12 insertions, 12 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index f6c2b24a8..87b3a2d74 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp | |||
| @@ -32,12 +32,6 @@ void nvdisp_disp0::flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u3 | |||
| 32 | 32 | ||
| 33 | Core::System::GetInstance().perf_stats.EndGameFrame(); | 33 | Core::System::GetInstance().perf_stats.EndGameFrame(); |
| 34 | 34 | ||
| 35 | // TODO(bunnei): The framebuffer region should only be flushed and invalidated if it is written | ||
| 36 | // to, not every frame. When we find the right place for this, the below line can be removed. | ||
| 37 | Memory::RasterizerFlushVirtualRegion(framebuffer.address, | ||
| 38 | framebuffer.width * framebuffer.height * 4, | ||
| 39 | Memory::FlushMode::FlushAndInvalidate); | ||
| 40 | |||
| 41 | VideoCore::g_renderer->SwapBuffers(framebuffer); | 35 | VideoCore::g_renderer->SwapBuffers(framebuffer); |
| 42 | } | 36 | } |
| 43 | 37 | ||
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index ef63cbcf0..4628f6db0 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -137,9 +137,15 @@ void RendererOpenGL::SwapBuffers(boost::optional<const Tegra::FramebufferConfig& | |||
| 137 | */ | 137 | */ |
| 138 | void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuffer, | 138 | void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuffer, |
| 139 | ScreenInfo& screen_info) { | 139 | ScreenInfo& screen_info) { |
| 140 | const u32 bpp{Tegra::FramebufferConfig::BytesPerPixel(framebuffer.pixel_format)}; | 140 | const u32 bytes_per_pixel{Tegra::FramebufferConfig::BytesPerPixel(framebuffer.pixel_format)}; |
| 141 | const u32 size_in_bytes{framebuffer.stride * framebuffer.height * bpp}; | 141 | const u64 size_in_bytes{framebuffer.stride * framebuffer.height * bytes_per_pixel}; |
| 142 | const VAddr framebuffer_addr{framebuffer.address}; | 142 | const VAddr framebuffer_addr{framebuffer.address + framebuffer.offset}; |
| 143 | |||
| 144 | // TODO(bunnei): The framebuffer region should only be flushed and invalidated if it is | ||
| 145 | // written to, not every frame. When we find the right place for this, the below line can be | ||
| 146 | // removed. | ||
| 147 | Memory::RasterizerFlushVirtualRegion(framebuffer_addr, size_in_bytes, | ||
| 148 | Memory::FlushMode::FlushAndInvalidate); | ||
| 143 | 149 | ||
| 144 | // Framebuffer orientation handling | 150 | // Framebuffer orientation handling |
| 145 | framebuffer_transform_flags = framebuffer.transform_flags; | 151 | framebuffer_transform_flags = framebuffer.transform_flags; |
| @@ -154,10 +160,10 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf | |||
| 154 | screen_info.display_texture = screen_info.texture.resource.handle; | 160 | screen_info.display_texture = screen_info.texture.resource.handle; |
| 155 | screen_info.display_texcoords = MathUtil::Rectangle<float>(0.f, 0.f, 1.f, 1.f); | 161 | screen_info.display_texcoords = MathUtil::Rectangle<float>(0.f, 0.f, 1.f, 1.f); |
| 156 | 162 | ||
| 157 | Rasterizer()->FlushRegion(framebuffer_addr, framebuffer.stride * framebuffer.height); | 163 | Rasterizer()->FlushRegion(framebuffer_addr, size_in_bytes); |
| 158 | 164 | ||
| 159 | VideoCore::MortonCopyPixels128(framebuffer.width, framebuffer.height, bpp, 4, | 165 | VideoCore::MortonCopyPixels128(framebuffer.width, framebuffer.height, bytes_per_pixel, 4, |
| 160 | Memory::GetPointer(framebuffer.address), | 166 | Memory::GetPointer(framebuffer_addr), |
| 161 | gl_framebuffer_data.data(), true); | 167 | gl_framebuffer_data.data(), true); |
| 162 | 168 | ||
| 163 | state.texture_units[0].texture_2d = screen_info.texture.resource.handle; | 169 | state.texture_units[0].texture_2d = screen_info.texture.resource.handle; |