summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_global_cache.h1
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp25
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h21
-rw-r--r--src/video_core/renderer_vulkan/vk_buffer_cache.h1
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
68protected: 68protected:
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
630MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); 630MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64));
631void CachedSurface::LoadGLBuffer() { 631void 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
670MICROPROFILE_DEFINE(OpenGL_SurfaceFlush, "OpenGL", "Surface Flush", MP_RGB(128, 192, 64)); 672MICROPROFILE_DEFINE(OpenGL_SurfaceFlush, "OpenGL", "Surface Flush", MP_RGB(128, 192, 64));
671void CachedSurface::FlushGLBuffer() { 673void 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
713void CachedSurface::UploadGLMipmapTexture(u32 mip_map, GLuint read_fb_handle, 715void 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
844MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64)); 848MICROPROFILE_DEFINE(OpenGL_TextureUL, "OpenGL", "Texture Upload", MP_RGB(128, 192, 64));
845void CachedSurface::UploadGLTexture(GLuint read_fb_handle, GLuint draw_fb_handle) { 849void 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
852void CachedSurface::UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x, 857void CachedSurface::UpdateSwizzle(Tegra::Texture::SwizzleSource swizzle_x,
@@ -926,8 +931,8 @@ Surface RasterizerCacheOpenGL::GetColorBufferSurface(std::size_t index, bool pre
926} 931}
927 932
928void RasterizerCacheOpenGL::LoadSurface(const Surface& surface) { 933void 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
356class RasterizerOpenGL; 356class RasterizerOpenGL;
357 357
358// This is used to store temporary big buffers,
359// instead of creating/destroying all the time
360struct RasterizerTemporaryMemory {
361 std::vector<std::vector<u8>> gl_buffer;
362};
363
358class CachedSurface final : public RasterizerCacheObject { 364class CachedSurface final : public RasterizerCacheObject {
359public: 365public:
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
427private: 434private:
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
472protected: 479protected:
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
477private: 484private:
@@ -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
53private: 52private:
54 VAddr cpu_addr{}; 53 VAddr cpu_addr{};
55 std::size_t size{}; 54 std::size_t size{};