summaryrefslogtreecommitdiff
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-01-22 22:17:23 -0300
committerGravatar ReinUsesLisp2021-02-13 02:18:38 -0300
commit0b8b9614426d099be7c5a02c147c9f97631c1c2f (patch)
tree1c16841c05a82fa3dc1fc4154219ae9d4dc04c2f /src/video_core/buffer_cache
parentMerge branch 'bytes-to-map-end' into new-bufcache-wip (diff)
downloadyuzu-0b8b9614426d099be7c5a02c147c9f97631c1c2f.tar.gz
yuzu-0b8b9614426d099be7c5a02c147c9f97631c1c2f.tar.xz
yuzu-0b8b9614426d099be7c5a02c147c9f97631c1c2f.zip
buffer_cache: Add extra bytes to guest SSBOs
Bind extra bytes beyond the guest API's bound range. This is due to some games like Astral Chain operating out of bounds. Binding the whole map range would be technically correct, but games have large maps that make this approach unaffordable for now.
Diffstat (limited to 'src/video_core/buffer_cache')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h8
1 files changed, 7 insertions, 1 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index a296036f4..2a6844ab1 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -1243,9 +1243,15 @@ typename BufferCache<P>::Binding BufferCache<P>::StorageBufferBinding(GPUVAddr s
1243 if (!cpu_addr || size == 0) { 1243 if (!cpu_addr || size == 0) {
1244 return NULL_BINDING; 1244 return NULL_BINDING;
1245 } 1245 }
1246 // HACK(Rodrigo): This is the number of bytes bound in host beyond the guest API's range.
1247 // It exists due to some games like Astral Chain operate out of bounds.
1248 // Binding the whole map range would be technically correct, but games have large maps that make
1249 // this approach unaffordable for now.
1250 static constexpr u32 arbitrary_extra_bytes = 0xc000;
1251 const u32 bytes_to_map_end = static_cast<u32>(gpu_memory.BytesToMapEnd(gpu_addr));
1246 const Binding binding{ 1252 const Binding binding{
1247 .cpu_addr = *cpu_addr, 1253 .cpu_addr = *cpu_addr,
1248 .size = size, 1254 .size = std::min(size + arbitrary_extra_bytes, bytes_to_map_end),
1249 .buffer_id = BufferId{}, 1255 .buffer_id = BufferId{},
1250 }; 1256 };
1251 return binding; 1257 return binding;