diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 27 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 4 |
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 | ||
| 14 | namespace OpenGL { | 15 | namespace OpenGL { |
| 15 | 16 | ||
| 17 | MICROPROFILE_DEFINE(OpenGL_Buffer_Download, "OpenGL", "Buffer Download", MP_RGB(192, 192, 128)); | ||
| 18 | |||
| 16 | CachedBufferBlock::CachedBufferBlock(CacheAddr cache_addr, const std::size_t size) | 19 | CachedBufferBlock::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 | ||
| 54 | void OGLBufferCache::DownloadBlockData(const Buffer& buffer, std::size_t offset, std::size_t size, | 57 | void 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 | } |