summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h27
-rw-r--r--src/video_core/renderer_opengl/gl_buffer_cache.cpp4
2 files changed, 30 insertions, 1 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 03b288233..38ce16ed5 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -79,12 +79,16 @@ public:
79 } 79 }
80 80
81 void Map(std::size_t max_size) { 81 void Map(std::size_t max_size) {
82 std::lock_guard lock{mutex};
83
82 std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4); 84 std::tie(buffer_ptr, buffer_offset_base, invalidated) = stream_buffer->Map(max_size, 4);
83 buffer_offset = buffer_offset_base; 85 buffer_offset = buffer_offset_base;
84 } 86 }
85 87
86 /// Finishes the upload stream, returns true on bindings invalidation. 88 /// Finishes the upload stream, returns true on bindings invalidation.
87 bool Unmap() { 89 bool Unmap() {
90 std::lock_guard lock{mutex};
91
88 stream_buffer->Unmap(buffer_offset - buffer_offset_base); 92 stream_buffer->Unmap(buffer_offset - buffer_offset_base);
89 return std::exchange(invalidated, false); 93 return std::exchange(invalidated, false);
90 } 94 }
@@ -103,7 +107,15 @@ public:
103 void FlushRegion(CacheAddr addr, std::size_t size) { 107 void FlushRegion(CacheAddr addr, std::size_t size) {
104 std::lock_guard lock{mutex}; 108 std::lock_guard lock{mutex};
105 109
106 // TODO 110 std::vector<MapInterval> objects = GetMapsInRange(addr, size);
111 std::sort(objects.begin(), objects.end(), [](const MapInterval& a, const MapInterval& b) {
112 return a->GetModificationTick() < b->GetModificationTick();
113 });
114 for (auto& object : objects) {
115 if (object->IsModified() && object->IsRegistered()) {
116 FlushMap(object);
117 }
118 }
107 } 119 }
108 120
109 /// Mark the specified region as being invalidated 121 /// Mark the specified region as being invalidated
@@ -205,11 +217,13 @@ private:
205 CacheAddr new_start = cache_addr; 217 CacheAddr new_start = cache_addr;
206 CacheAddr new_end = cache_addr_end; 218 CacheAddr new_end = cache_addr_end;
207 bool write_inheritance = false; 219 bool write_inheritance = false;
220 bool modified_inheritance = false;
208 // Calculate new buffer parameters 221 // Calculate new buffer parameters
209 for (auto& overlap : overlaps) { 222 for (auto& overlap : overlaps) {
210 new_start = std::min(overlap->GetStart(), new_start); 223 new_start = std::min(overlap->GetStart(), new_start);
211 new_end = std::max(overlap->GetEnd(), new_end); 224 new_end = std::max(overlap->GetEnd(), new_end);
212 write_inheritance |= overlap->IsWritten(); 225 write_inheritance |= overlap->IsWritten();
226 modified_inheritance |= overlap->IsModified();
213 } 227 }
214 GPUVAddr new_gpu_addr = gpu_addr + new_start - cache_addr; 228 GPUVAddr new_gpu_addr = gpu_addr + new_start - cache_addr;
215 for (auto& overlap : overlaps) { 229 for (auto& overlap : overlaps) {
@@ -217,6 +231,9 @@ private:
217 } 231 }
218 UpdateBlock(block, new_start, new_end, overlaps); 232 UpdateBlock(block, new_start, new_end, overlaps);
219 MapInterval new_map = CreateMap(new_start, new_end, new_gpu_addr); 233 MapInterval new_map = CreateMap(new_start, new_end, new_gpu_addr);
234 if (modified_inheritance) {
235 new_map->MarkAsModified(true, GetModifiedTicks());
236 }
220 Register(new_map, write_inheritance); 237 Register(new_map, write_inheritance);
221 return new_map; 238 return new_map;
222 } 239 }
@@ -258,6 +275,14 @@ private:
258 return ++modified_ticks; 275 return ++modified_ticks;
259 } 276 }
260 277
278 void FlushMap(MapInterval map) {
279 std::size_t size = map->GetEnd() - map->GetStart();
280 TBuffer block = blocks[map->GetStart() >> block_page_bits];
281 u8* host_ptr = FromCacheAddr(map->GetStart());
282 DownloadBlockData(block, block->GetOffset(map->GetStart()), size, host_ptr);
283 map->MarkAsModified(false, 0);
284 }
285
261 BufferInfo StreamBufferUpload(const void* raw_pointer, std::size_t size, 286 BufferInfo StreamBufferUpload(const void* raw_pointer, std::size_t size,
262 std::size_t alignment) { 287 std::size_t alignment) {
263 AlignBuffer(alignment); 288 AlignBuffer(alignment);
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
index a45d2771b..0781e6595 100644
--- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp
@@ -7,12 +7,15 @@
7#include <glad/glad.h> 7#include <glad/glad.h>
8 8
9#include "common/assert.h" 9#include "common/assert.h"
10#include "common/microprofile.h"
10#include "video_core/renderer_opengl/gl_buffer_cache.h" 11#include "video_core/renderer_opengl/gl_buffer_cache.h"
11#include "video_core/renderer_opengl/gl_rasterizer.h" 12#include "video_core/renderer_opengl/gl_rasterizer.h"
12#include "video_core/renderer_opengl/gl_resource_manager.h" 13#include "video_core/renderer_opengl/gl_resource_manager.h"
13 14
14namespace OpenGL { 15namespace OpenGL {
15 16
17MICROPROFILE_DEFINE(OpenGL_Buffer_Download, "OpenGL", "Buffer Download", MP_RGB(192, 192, 128));
18
16CachedBufferBlock::CachedBufferBlock(CacheAddr cache_addr, const std::size_t size) 19CachedBufferBlock::CachedBufferBlock(CacheAddr cache_addr, const std::size_t size)
17 : VideoCommon::BufferBlock{cache_addr, size} { 20 : VideoCommon::BufferBlock{cache_addr, size} {
18 gl_buffer.Create(); 21 gl_buffer.Create();
@@ -53,6 +56,7 @@ void OGLBufferCache::UploadBlockData(const Buffer& buffer, std::size_t offset, s
53 56
54void OGLBufferCache::DownloadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, 57void OGLBufferCache::DownloadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size,
55 u8* data) { 58 u8* data) {
59 MICROPROFILE_SCOPE(OpenGL_Buffer_Download);
56 glGetNamedBufferSubData(*buffer->GetHandle(), static_cast<GLintptr>(offset), 60 glGetNamedBufferSubData(*buffer->GetHandle(), static_cast<GLintptr>(offset),
57 static_cast<GLsizeiptr>(size), data); 61 static_cast<GLsizeiptr>(size), data);
58} 62}