diff options
Diffstat (limited to 'src')
4 files changed, 30 insertions, 18 deletions
diff --git a/src/video_core/renderer_opengl/gl_global_cache.h b/src/video_core/renderer_opengl/gl_global_cache.h index 3211f0112..2d467a240 100644 --- a/src/video_core/renderer_opengl/gl_global_cache.h +++ b/src/video_core/renderer_opengl/gl_global_cache.h | |||
| @@ -66,7 +66,6 @@ public: | |||
| 66 | Tegra::Engines::Maxwell3D::Regs::ShaderStage stage); | 66 | Tegra::Engines::Maxwell3D::Regs::ShaderStage stage); |
| 67 | 67 | ||
| 68 | protected: | 68 | protected: |
| 69 | |||
| 70 | void FlushObjectInner(const GlobalRegion& object) override { | 69 | void FlushObjectInner(const GlobalRegion& object) override { |
| 71 | object->Flush(); | 70 | object->Flush(); |
| 72 | } | 71 | } |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index 7a68b8738..67f99a568 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | |||
| @@ -628,9 +628,11 @@ CachedSurface::CachedSurface(const SurfaceParams& params) | |||
| 628 | } | 628 | } |
| 629 | 629 | ||
| 630 | MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); | 630 | MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); |
| 631 | void CachedSurface::LoadGLBuffer() { | 631 | void CachedSurface::LoadGLBuffer(RasterizerTemporaryMemory& res_cache_tmp_mem) { |
| 632 | MICROPROFILE_SCOPE(OpenGL_SurfaceLoad); | 632 | MICROPROFILE_SCOPE(OpenGL_SurfaceLoad); |
| 633 | gl_buffer.resize(params.max_mip_level); | 633 | auto& gl_buffer = res_cache_tmp_mem.gl_buffer; |
| 634 | if (gl_buffer.size() < params.max_mip_level) | ||
| 635 | gl_buffer.resize(params.max_mip_level); | ||
| 634 | for (u32 i = 0; i < params.max_mip_level; i++) | 636 | for (u32 i = 0; i < params.max_mip_level; i++) |
| 635 | gl_buffer[i].resize(params.GetMipmapSizeGL(i)); | 637 | gl_buffer[i].resize(params.GetMipmapSizeGL(i)); |
| 636 | if (params.is_tiled) { | 638 | if (params.is_tiled) { |
| @@ -668,13 +670,13 @@ void CachedSurface::LoadGLBuffer() { | |||
| 668 | } | 670 | } |
| 669 | 671 | ||
| 670 | MICROPROFILE_DEFINE(OpenGL_SurfaceFlush, "OpenGL", "Surface Flush", MP_RGB(128, 192, 64)); | 672 | MICROPROFILE_DEFINE(OpenGL_SurfaceFlush, "OpenGL", "Surface Flush", MP_RGB(128, 192, 64)); |
| 671 | void CachedSurface::FlushGLBuffer() { | 673 | void CachedSurface::FlushGLBuffer(RasterizerTemporaryMemory& res_cache_tmp_mem) { |
| 672 | MICROPROFILE_SCOPE(OpenGL_SurfaceFlush); | 674 | MICROPROFILE_SCOPE(OpenGL_SurfaceFlush); |
| 673 | 675 | ||
| 674 | ASSERT_MSG(!IsPixelFormatASTC(params.pixel_format), "Unimplemented"); | 676 | ASSERT_MSG(!IsPixelFormatASTC(params.pixel_format), "Unimplemented"); |
| 675 | 677 | ||
| 678 | auto& gl_buffer = res_cache_tmp_mem.gl_buffer; | ||
| 676 | // OpenGL temporary buffer needs to be big enough to store raw texture size | 679 | // OpenGL temporary buffer needs to be big enough to store raw texture size |
| 677 | gl_buffer.resize(1); | ||
| 678 | gl_buffer[0].resize(GetSizeInBytes()); | 680 | gl_buffer[0].resize(GetSizeInBytes()); |
| 679 | 681 | ||
| 680 | const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type); | 682 | const FormatTuple& tuple = GetFormatTuple(params.pixel_format, params.component_type); |
| @@ -710,10 +712,12 @@ void CachedSurface::FlushGLBuffer() { | |||
| 710 | } | 712 | } |
| 711 | } | 713 | } |
| 712 | 714 | ||
| 713 | void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle, | 715 | void CachedSurface::UploadGLMipmapTexture(RasterizerTemporaryMemory& res_cache_tmp_mem, u32 mip_map, |
| 714 | GLuint draw_fb_handle) { | 716 | GLuint read_fb_handle, GLuint draw_fb_handle) { |
| 715 | const auto& rect{params.GetRect(mip_map)}; | 717 | const auto& rect{params.GetRect(mip_map)}; |
| 716 | 718 | ||
| 719 | auto& gl_buffer = res_cache_tmp_mem.gl_buffer; | ||
| 720 | |||
| 717 | // Load data from memory to the surface | 721 | // Load data from memory to the surface |
| 718 | const auto x0 = static_cast<GLint>(rect.left); | 722 | const auto x0 = static_cast<GLint>(rect.left); |
| 719 | const auto y0 = static_cast<GLint>(rect.bottom); | 723 | const auto y0 = static_cast<GLint>(rect.bottom); |
| @@ -842,11 +846,12 @@ void CachedSurface::EnsureTextureDiscrepantView() { | |||
| 842 | } | 846 | } |
| 843 | 847 | ||
| 844 | MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64)); | 848 | MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64)); |
| 845 | void CachedSurface::UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle) { | 849 | void CachedSurface::UploadGLTexture(RasterizerTemporaryMemory& res_cache_tmp_mem, |
| 850 | GLuint read_fb_handle, GLuint draw_fb_handle) { | ||
| 846 | MICROPROFILE_SCOPE(OpenGL_TextureUL); | 851 | MICROPROFILE_SCOPE(OpenGL_TextureUL); |
| 847 | 852 | ||
| 848 | for (u32 i = 0; i < params.max_mip_level; i++) | 853 | for (u32 i = 0; i < params.max_mip_level; i++) |
| 849 | UploadGLMipmapTexture(i, read_fb_handle, draw_fb_handle); | 854 | UploadGLMipmapTexture(res_cache_tmp_mem, i, read_fb_handle, draw_fb_handle); |
| 850 | } | 855 | } |
| 851 | 856 | ||
| 852 | void CachedSurface::UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, | 857 | void CachedSurface::UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, |
| @@ -926,8 +931,8 @@ Surface RasterizerCacheOpenGL::GetColorBufferSurface(std::size_t index, bool pre | |||
| 926 | } | 931 | } |
| 927 | 932 | ||
| 928 | void RasterizerCacheOpenGL::LoadSurface(const Surface& surface) { | 933 | void RasterizerCacheOpenGL::LoadSurface(const Surface& surface) { |
| 929 | surface->LoadGLBuffer(); | 934 | surface->LoadGLBuffer(temporal_memory); |
| 930 | surface->UploadGLTexture(read_framebuffer.handle, draw_framebuffer.handle); | 935 | surface->UploadGLTexture(temporal_memory, read_framebuffer.handle, draw_framebuffer.handle); |
| 931 | surface->MarkAsModified(false, *this); | 936 | surface->MarkAsModified(false, *this); |
| 932 | surface->MarkForReload(false); | 937 | surface->MarkForReload(false); |
| 933 | } | 938 | } |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h index 4b21c555f..6263ef3e7 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h | |||
| @@ -355,6 +355,12 @@ namespace OpenGL { | |||
| 355 | 355 | ||
| 356 | class RasterizerOpenGL; | 356 | class RasterizerOpenGL; |
| 357 | 357 | ||
| 358 | // This is used to store temporary big buffers, | ||
| 359 | // instead of creating/destroying all the time | ||
| 360 | struct RasterizerTemporaryMemory { | ||
| 361 | std::vector<std::vector<u8>> gl_buffer; | ||
| 362 | }; | ||
| 363 | |||
| 358 | class CachedSurface final : public RasterizerCacheObject { | 364 | class CachedSurface final : public RasterizerCacheObject { |
| 359 | public: | 365 | public: |
| 360 | explicit CachedSurface(const SurfaceParams& params); | 366 | explicit CachedSurface(const SurfaceParams& params); |
| @@ -393,11 +399,12 @@ public: | |||
| 393 | } | 399 | } |
| 394 | 400 | ||
| 395 | // Read/Write data in Switch memory to/from gl_buffer | 401 | // Read/Write data in Switch memory to/from gl_buffer |
| 396 | void LoadGLBuffer(); | 402 | void LoadGLBuffer(RasterizerTemporaryMemory& res_cache_tmp_mem); |
| 397 | void FlushGLBuffer(); | 403 | void FlushGLBuffer(RasterizerTemporaryMemory& res_cache_tmp_mem); |
| 398 | 404 | ||
| 399 | // Upload data in gl_buffer to this surface's texture | 405 | // Upload data in gl_buffer to this surface's texture |
| 400 | void UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle); | 406 | void UploadGLTexture(RasterizerTemporaryMemory& res_cache_tmp_mem, GLuint read_fb_handle, |
| 407 | GLuint draw_fb_handle); | ||
| 401 | 408 | ||
| 402 | void UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, | 409 | void UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, |
| 403 | Tegra::Texture::SwizzleSource swizzle_y, | 410 | Tegra::Texture::SwizzleSource swizzle_y, |
| @@ -425,13 +432,13 @@ public: | |||
| 425 | } | 432 | } |
| 426 | 433 | ||
| 427 | private: | 434 | private: |
| 428 | void UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle, GLuint draw_fb_handle); | 435 | void UploadGLMipmapTexture(RasterizerTemporaryMemory& res_cache_tmp_mem, u32 mip_map, |
| 436 | GLuint read_fb_handle, GLuint draw_fb_handle); | ||
| 429 | 437 | ||
| 430 | void EnsureTextureDiscrepantView(); | 438 | void EnsureTextureDiscrepantView(); |
| 431 | 439 | ||
| 432 | OGLTexture texture; | 440 | OGLTexture texture; |
| 433 | OGLTexture discrepant_view; | 441 | OGLTexture discrepant_view; |
| 434 | std::vector<std::vector<u8>> gl_buffer; | ||
| 435 | SurfaceParams params{}; | 442 | SurfaceParams params{}; |
| 436 | GLenum gl_target{}; | 443 | GLenum gl_target{}; |
| 437 | GLenum gl_internal_format{}; | 444 | GLenum gl_internal_format{}; |
| @@ -471,7 +478,7 @@ public: | |||
| 471 | 478 | ||
| 472 | protected: | 479 | protected: |
| 473 | void FlushObjectInner(const Surface& object) override { | 480 | void FlushObjectInner(const Surface& object) override { |
| 474 | object->FlushGLBuffer(); | 481 | object->FlushGLBuffer(temporal_memory); |
| 475 | } | 482 | } |
| 476 | 483 | ||
| 477 | private: | 484 | private: |
| @@ -520,6 +527,8 @@ private: | |||
| 520 | std::array<Surface, Maxwell::NumRenderTargets> current_color_buffers; | 527 | std::array<Surface, Maxwell::NumRenderTargets> current_color_buffers; |
| 521 | Surface last_depth_buffer; | 528 | Surface last_depth_buffer; |
| 522 | 529 | ||
| 530 | RasterizerTemporaryMemory temporal_memory; | ||
| 531 | |||
| 523 | using SurfaceIntervalCache = boost::icl::interval_map<CacheAddr, Surface>; | 532 | using SurfaceIntervalCache = boost::icl::interval_map<CacheAddr, Surface>; |
| 524 | using SurfaceInterval = typename SurfaceIntervalCache::interval_type; | 533 | using SurfaceInterval = typename SurfaceIntervalCache::interval_type; |
| 525 | 534 | ||
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 5082f86b6..3edf460df 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -49,7 +49,6 @@ public: | |||
| 49 | return alignment; | 49 | return alignment; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | |||
| 53 | private: | 52 | private: |
| 54 | VAddr cpu_addr{}; | 53 | VAddr cpu_addr{}; |
| 55 | std::size_t size{}; | 54 | std::size_t size{}; |