diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.h | 5 |
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 | |||
| 564 | CachedSurface::CachedSurface(const SurfaceParams& params) | 564 | CachedSurface::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 | ||
| 622 | MICROPROFILE_DEFINE(OpenGL_SurfaceLoad, "OpenGL", "Surface Load", MP_RGB(128, 192, 64)); | 614 | MICROPROFILE_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 | ||
| 927 | Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, bool preserve_contents) { | 919 | Surface 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 { |