summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2018-04-24 06:46:51 +0200
committerbunnei <bunneidev@gmail.com>2018-04-25 04:31:46 +0200
commitfbb3cd110c598003bf58a2aca5be489b5f3fb772 (patch)
tree570d425c25583a3609d719e3b5f495a5dbbf00b1 /src/video_core/renderer_opengl/gl_rasterizer_cache.cpp
parentgl_rasterizer_cache: Handle compressed texture sizes. (diff)
downloadyuzu-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.cpp27
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) {