diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-05-29 23:15:28 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-07-06 05:37:55 +0200 |
commit | 345f852bdb64d1a779ac617965f46f5b8227eca5 (patch) | |
tree | 68e3d6c6c07bf3a47956c0a4015dfb777eeaf589 /src/video_core/renderer_opengl/gl_buffer_cache.cpp | |
parent | gl_buffer_cache: Rework to support internalized buffers (diff) | |
download | yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar.gz yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar.bz2 yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar.lz yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar.xz yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.tar.zst yuzu-345f852bdb64d1a779ac617965f46f5b8227eca5.zip |
Diffstat (limited to 'src/video_core/renderer_opengl/gl_buffer_cache.cpp')
-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); } |