diff options
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 1219ca6ea..2f603e3d7 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp @@ -49,7 +49,8 @@ void OGLBufferCache::Unregister(const std::shared_ptr<CachedBufferEntry>& entry) } OGLBufferCache::BufferInfo OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, - std::size_t alignment, bool internalize) { + std::size_t alignment, bool internalize, + bool is_written) { std::lock_guard lock{mutex}; auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); @@ -68,18 +69,22 @@ OGLBufferCache::BufferInfo OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std:: auto entry = TryGet(host_ptr); if (!entry) { - return FixedBufferUpload(gpu_addr, host_ptr, size, internalize); + return FixedBufferUpload(gpu_addr, host_ptr, size, internalize, is_written); } if (entry->GetSize() < size) { GrowBuffer(entry, size); } + if (is_written) { + entry->MarkAsModified(true, *this); + } return {entry->GetBuffer(), CachedBufferOffset}; } OGLBufferCache::BufferInfo OGLBufferCache::UploadHostMemory(const void* raw_pointer, std::size_t size, std::size_t alignment) { + std::lock_guard lock{mutex}; return StreamBufferUpload(raw_pointer, size, alignment); } @@ -108,10 +113,8 @@ OGLBufferCache::BufferInfo OGLBufferCache::StreamBufferUpload(const void* raw_po } OGLBufferCache::BufferInfo OGLBufferCache::FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, - std::size_t size, bool internalize) { - if (internalize) { - internalized_entries.emplace(ToCacheAddr(host_ptr)); - } + std::size_t size, bool internalize, + bool is_written) { auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); const auto cpu_addr = *memory_manager.GpuToCpuAddress(gpu_addr); auto entry = GetUncachedBuffer(cpu_addr, host_ptr); @@ -119,6 +122,13 @@ OGLBufferCache::BufferInfo OGLBufferCache::FixedBufferUpload(GPUVAddr gpu_addr, entry->SetInternalState(internalize); Register(entry); + if (internalize) { + internalized_entries.emplace(ToCacheAddr(host_ptr)); + } + if (is_written) { + entry->MarkAsModified(true, *this); + } + if (entry->GetCapacity() < size) { entry->SetCapacity(CreateBuffer(size, GL_STATIC_DRAW), size); } |