summaryrefslogtreecommitdiff
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/buffer_cache')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 2442ddfd6..63b3a8205 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -30,7 +30,7 @@ public:
30 using BufferInfo = std::pair<const TBufferType*, u64>; 30 using BufferInfo = std::pair<const TBufferType*, u64>;
31 31
32 BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, 32 BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4,
33 bool is_written = false) { 33 bool is_written = false, bool use_fast_cbuf = false) {
34 std::lock_guard lock{mutex}; 34 std::lock_guard lock{mutex};
35 35
36 auto& memory_manager = system.GPU().MemoryManager(); 36 auto& memory_manager = system.GPU().MemoryManager();
@@ -43,9 +43,13 @@ public:
43 // Cache management is a big overhead, so only cache entries with a given size. 43 // Cache management is a big overhead, so only cache entries with a given size.
44 // TODO: Figure out which size is the best for given games. 44 // TODO: Figure out which size is the best for given games.
45 constexpr std::size_t max_stream_size = 0x800; 45 constexpr std::size_t max_stream_size = 0x800;
46 if (size < max_stream_size) { 46 if (use_fast_cbuf || size < max_stream_size) {
47 if (!is_written && !IsRegionWritten(cache_addr, cache_addr + size - 1)) { 47 if (!is_written && !IsRegionWritten(cache_addr, cache_addr + size - 1)) {
48 return StreamBufferUpload(host_ptr, size, alignment); 48 if (use_fast_cbuf) {
49 return ConstBufferUpload(host_ptr, size);
50 } else {
51 return StreamBufferUpload(host_ptr, size, alignment);
52 }
49 } 53 }
50 } 54 }
51 55
@@ -152,6 +156,10 @@ protected:
152 virtual void CopyBlock(const TBuffer& src, const TBuffer& dst, std::size_t src_offset, 156 virtual void CopyBlock(const TBuffer& src, const TBuffer& dst, std::size_t src_offset,
153 std::size_t dst_offset, std::size_t size) = 0; 157 std::size_t dst_offset, std::size_t size) = 0;
154 158
159 virtual BufferInfo ConstBufferUpload(const void* raw_pointer, std::size_t size) {
160 return {};
161 }
162
155 /// Register an object into the cache 163 /// Register an object into the cache
156 void Register(const MapInterval& new_map, bool inherit_written = false) { 164 void Register(const MapInterval& new_map, bool inherit_written = false) {
157 const CacheAddr cache_ptr = new_map->GetStart(); 165 const CacheAddr cache_ptr = new_map->GetStart();