summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_opengl/gl_buffer_cache.cpp
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2019-05-29 23:15:28 +0200
committerReinUsesLisp <reinuseslisp@airmail.cc>2019-07-06 05:37:55 +0200
commit345f852bdb64d1a779ac617965f46f5b8227eca5 (patch)
tree68e3d6c6c07bf3a47956c0a4015dfb777eeaf589 /src/video_core/renderer_opengl/gl_buffer_cache.cpp
parentgl_buffer_cache: Rework to support internalized buffers (diff)
downloadyuzu-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.cpp22
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);
}