diff options
author | bunnei <bunneidev@gmail.com> | 2018-04-24 06:46:51 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2018-04-25 04:31:46 +0200 |
commit | fbb3cd110c598003bf58a2aca5be489b5f3fb772 (patch) | |
tree | 570d425c25583a3609d719e3b5f495a5dbbf00b1 /src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | |
parent | gl_rasterizer_cache: Handle compressed texture sizes. (diff) | |
download | yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar.gz yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar.bz2 yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar.lz yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar.xz yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.tar.zst yuzu-fbb3cd110c598003bf58a2aca5be489b5f3fb772.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer_cache.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp index e1ad00feb..b924f1b8e 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp @@ -954,6 +954,33 @@ Surface RasterizerCacheOpenGL::GetSurface(const SurfaceParams& params, ScaleMatc return surface; } +boost::optional<Tegra::GPUVAddr> RasterizerCacheOpenGL::TryFindFramebufferGpuAddress( + VAddr cpu_addr) const { + // Tries to find the GPU address of a framebuffer based on the CPU address. This is because + // final output framebuffers are specified by CPU address, but internally our GPU cache uses GPU + // addresses. We iterate through all cached framebuffers, and compare their starting CPU address + // to the one provided. This is obviously not great, and won't work if the framebuffer overlaps + // surfaces. + + std::vector<Tegra::GPUVAddr> gpu_addresses; + for (const auto& pair : surface_cache) { + for (const auto& surface : pair.second) { + const VAddr surface_cpu_addr = surface->GetCpuAddr(); + if (cpu_addr >= surface_cpu_addr && cpu_addr < (surface_cpu_addr + surface->size)) { + ASSERT_MSG(cpu_addr == surface_cpu_addr, "overlapping surfaces are unsupported"); + gpu_addresses.push_back(surface->addr); + } + } + } + + if (gpu_addresses.empty()) { + return {}; + } + + ASSERT_MSG(gpu_addresses.size() == 1, ">1 surface is unsupported"); + return gpu_addresses[0]; +} + SurfaceRect_Tuple RasterizerCacheOpenGL::GetSurfaceSubRect(const SurfaceParams& params, ScaleMatch match_res_scale, bool load_if_create) { |