summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.cpp22
-rw-r--r--src/video_core/renderer_opengl/gl_rasterizer_cache.h5
2 files changed, 12 insertions, 15 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
index b94446428..39dcf71ce 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
@@ -564,6 +564,12 @@ void RasterizerCacheOpenGL::CopySurface(const Surface& src_surface, const Surfac
564CachedSurface::CachedSurface(const SurfaceParams& params) 564CachedSurface::CachedSurface(const SurfaceParams& params)
565 : params{params}, gl_target{SurfaceTargetToGL(params.target)}, 565 : params{params}, gl_target{SurfaceTargetToGL(params.target)},
566 cached_size_in_bytes{params.size_in_bytes}, RasterizerCacheObject{params.host_ptr} { 566 cached_size_in_bytes{params.size_in_bytes}, RasterizerCacheObject{params.host_ptr} {
567
568 const auto optional_cpu_addr{
569 Core::System::GetInstance().GPU().MemoryManager().GpuToCpuAddress(params.gpu_addr)};
570 ASSERT_MSG(optional_cpu_addr, "optional_cpu_addr is invalid");
571 cpu_addr = *optional_cpu_addr;
572
567 texture.Create(gl_target); 573 texture.Create(gl_target);
568 574
569 // TODO(Rodrigo): Using params.GetRect() returns a different size than using its Mip*(0) 575 // TODO(Rodrigo): Using params.GetRect() returns a different size than using its Mip*(0)
@@ -603,20 +609,6 @@ CachedSurface::CachedSurface(const SurfaceParams& params)
603 ApplyTextureDefaults(texture.handle, params.max_mip_level); 609 ApplyTextureDefaults(texture.handle, params.max_mip_level);
604 610
605 OpenGL::LabelGLObject(GL_TEXTURE, texture.handle, params.gpu_addr, params.IdentityString()); 611 OpenGL::LabelGLObject(GL_TEXTURE, texture.handle, params.gpu_addr, params.IdentityString());
606
607 // Clamp size to mapped GPU memory region
608 // TODO(bunnei): Super Mario Odyssey maps a 0x40000 byte region and then uses it for a 0x80000
609 // R32F render buffer. We do not yet know if this is a game bug or something else, but this
610 // check is necessary to prevent flushing from overwriting unmapped memory.
611
612 auto& memory_manager{Core::System::GetInstance().GPU().MemoryManager()};
613 // const u64 max_size{memory_manager.GetRegionEnd(params.gpu_addr) - params.gpu_addr};
614 // if (cached_size_in_bytes > max_size) {
615 // LOG_ERROR(HW_GPU, "Surface size {} exceeds region size {}", params.size_in_bytes,
616 // max_size); cached_size_in_bytes = max_size;
617 //}
618
619 cpu_addr = *memory_manager.GpuToCpuAddress(params.gpu_addr);
620} 612}
621 613
622MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); 614MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64));
@@ -925,7 +917,7 @@ void RasterizerCacheOpenGL::LoadSurface(const Surface& surface) {
925} 917}
926 918
927Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool preserve_contents) { 919Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool preserve_contents) {
928 if (params.gpu_addr == 0 || params.height * params.width == 0) { 920 if (!params.IsValid()) {
929 return {}; 921 return {};
930 } 922 }
931 923
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.h b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
index d76bc0ee7..0efcafd07 100644
--- a/src/video_core/renderer_opengl/gl_rasterizer_cache.h
+++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.h
@@ -109,6 +109,11 @@ struct SurfaceParams {
109 return size; 109 return size;
110 } 110 }
111 111
112 /// Returns true if the parameters constitute a valid rasterizer surface.
113 bool IsValid() const {
114 return gpu_addr && host_ptr && height && width;
115 }
116
112 /// Returns the exact size of the memory occupied by a layer in a texture in VRAM, including 117 /// Returns the exact size of the memory occupied by a layer in a texture in VRAM, including
113 /// mipmaps. 118 /// mipmaps.
114 std::size_t LayerMemorySize() const { 119 std::size_t LayerMemorySize() const {