diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 22 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_global_cache.cpp | 102 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_global_cache.h | 82 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 27 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 2 |
7 files changed, 35 insertions, 206 deletions
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 6839abe71..7aefd4035 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt | |||
| @@ -43,8 +43,6 @@ add_library(video_core STATIC | |||
| 43 | renderer_opengl/gl_device.h | 43 | renderer_opengl/gl_device.h |
| 44 | renderer_opengl/gl_framebuffer_cache.cpp | 44 | renderer_opengl/gl_framebuffer_cache.cpp |
| 45 | renderer_opengl/gl_framebuffer_cache.h | 45 | renderer_opengl/gl_framebuffer_cache.h |
| 46 | renderer_opengl/gl_global_cache.cpp | ||
| 47 | renderer_opengl/gl_global_cache.h | ||
| 48 | renderer_opengl/gl_rasterizer.cpp | 46 | renderer_opengl/gl_rasterizer.cpp |
| 49 | renderer_opengl/gl_rasterizer.h | 47 | renderer_opengl/gl_rasterizer.h |
| 50 | renderer_opengl/gl_resource_manager.cpp | 48 | renderer_opengl/gl_resource_manager.cpp |
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) | |||
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | OGLBufferCache::BufferInfo OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, | 51 | OGLBufferCache::BufferInfo OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std::size_t size, |
| 52 | std::size_t alignment, bool internalize) { | 52 | std::size_t alignment, bool internalize, |
| 53 | bool is_written) { | ||
| 53 | std::lock_guard lock{mutex}; | 54 | std::lock_guard lock{mutex}; |
| 54 | 55 | ||
| 55 | auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); | 56 | auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); |
| @@ -68,18 +69,22 @@ OGLBufferCache::BufferInfo OGLBufferCache::UploadMemory(GPUVAddr gpu_addr, std:: | |||
| 68 | 69 | ||
| 69 | auto entry = TryGet(host_ptr); | 70 | auto entry = TryGet(host_ptr); |
| 70 | if (!entry) { | 71 | if (!entry) { |
| 71 | return FixedBufferUpload(gpu_addr, host_ptr, size, internalize); | 72 | return FixedBufferUpload(gpu_addr, host_ptr, size, internalize, is_written); |
| 72 | } | 73 | } |
| 73 | 74 | ||
| 74 | if (entry->GetSize() < size) { | 75 | if (entry->GetSize() < size) { |
| 75 | GrowBuffer(entry, size); | 76 | GrowBuffer(entry, size); |
| 76 | } | 77 | } |
| 78 | if (is_written) { | ||
| 79 | entry->MarkAsModified(true, *this); | ||
| 80 | } | ||
| 77 | return {entry->GetBuffer(), CachedBufferOffset}; | 81 | return {entry->GetBuffer(), CachedBufferOffset}; |
| 78 | } | 82 | } |
| 79 | 83 | ||
| 80 | OGLBufferCache::BufferInfo OGLBufferCache::UploadHostMemory(const void* raw_pointer, | 84 | OGLBufferCache::BufferInfo OGLBufferCache::UploadHostMemory(const void* raw_pointer, |
| 81 | std::size_t size, | 85 | std::size_t size, |
| 82 | std::size_t alignment) { | 86 | std::size_t alignment) { |
| 87 | std::lock_guard lock{mutex}; | ||
| 83 | return StreamBufferUpload(raw_pointer, size, alignment); | 88 | return StreamBufferUpload(raw_pointer, size, alignment); |
| 84 | } | 89 | } |
| 85 | 90 | ||
| @@ -108,10 +113,8 @@ OGLBufferCache::BufferInfo OGLBufferCache::StreamBufferUpload(const void* raw_po | |||
| 108 | } | 113 | } |
| 109 | 114 | ||
| 110 | OGLBufferCache::BufferInfo OGLBufferCache::FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, | 115 | OGLBufferCache::BufferInfo OGLBufferCache::FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, |
| 111 | std::size_t size, bool internalize) { | 116 | std::size_t size, bool internalize, |
| 112 | if (internalize) { | 117 | bool is_written) { |
| 113 | internalized_entries.emplace(ToCacheAddr(host_ptr)); | ||
| 114 | } | ||
| 115 | auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); | 118 | auto& memory_manager = Core::System::GetInstance().GPU().MemoryManager(); |
| 116 | const auto cpu_addr = *memory_manager.GpuToCpuAddress(gpu_addr); | 119 | const auto cpu_addr = *memory_manager.GpuToCpuAddress(gpu_addr); |
| 117 | auto entry = GetUncachedBuffer(cpu_addr, host_ptr); | 120 | auto entry = GetUncachedBuffer(cpu_addr, host_ptr); |
| @@ -119,6 +122,13 @@ OGLBufferCache::BufferInfo OGLBufferCache::FixedBufferUpload(GPUVAddr gpu_addr, | |||
| 119 | entry->SetInternalState(internalize); | 122 | entry->SetInternalState(internalize); |
| 120 | Register(entry); | 123 | Register(entry); |
| 121 | 124 | ||
| 125 | if (internalize) { | ||
| 126 | internalized_entries.emplace(ToCacheAddr(host_ptr)); | ||
| 127 | } | ||
| 128 | if (is_written) { | ||
| 129 | entry->MarkAsModified(true, *this); | ||
| 130 | } | ||
| 131 | |||
| 122 | if (entry->GetCapacity() < size) { | 132 | if (entry->GetCapacity() < size) { |
| 123 | entry->SetCapacity(CreateBuffer(size, GL_STATIC_DRAW), size); | 133 | entry->SetCapacity(CreateBuffer(size, GL_STATIC_DRAW), size); |
| 124 | } | 134 | } |
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index 00bc6008a..b4fbd201d 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h | |||
| @@ -82,7 +82,7 @@ public: | |||
| 82 | /// Uploads data from a guest GPU address. Returns the OpenGL buffer where it's located and its | 82 | /// Uploads data from a guest GPU address. Returns the OpenGL buffer where it's located and its |
| 83 | /// offset. | 83 | /// offset. |
| 84 | BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, | 84 | BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, |
| 85 | bool internalize = false); | 85 | bool internalize = false, bool is_written = false); |
| 86 | 86 | ||
| 87 | /// Uploads from a host memory. Returns the OpenGL buffer where it's located and its offset. | 87 | /// Uploads from a host memory. Returns the OpenGL buffer where it's located and its offset. |
| 88 | BufferInfo UploadHostMemory(const void* raw_pointer, std::size_t size, | 88 | BufferInfo UploadHostMemory(const void* raw_pointer, std::size_t size, |
| @@ -99,7 +99,7 @@ private: | |||
| 99 | BufferInfo StreamBufferUpload(const void* raw_pointer, std::size_t size, std::size_t alignment); | 99 | BufferInfo StreamBufferUpload(const void* raw_pointer, std::size_t size, std::size_t alignment); |
| 100 | 100 | ||
| 101 | BufferInfo FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, std::size_t size, | 101 | BufferInfo FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, std::size_t size, |
| 102 | bool internalize); | 102 | bool internalize, bool is_written); |
| 103 | 103 | ||
| 104 | void GrowBuffer(std::shared_ptr<CachedBufferEntry>& entry, std::size_t new_size); | 104 | void GrowBuffer(std::shared_ptr<CachedBufferEntry>& entry, std::size_t new_size); |
| 105 | 105 | ||
diff --git a/src/video_core/renderer_opengl/gl_global_cache.cpp b/src/video_core/renderer_opengl/gl_global_cache.cpp deleted file mode 100644 index d5e385151..000000000 --- a/src/video_core/renderer_opengl/gl_global_cache.cpp +++ /dev/null | |||
| @@ -1,102 +0,0 @@ | |||
| 1 | // Copyright 2018 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include <glad/glad.h> | ||
| 6 | |||
| 7 | #include "common/logging/log.h" | ||
| 8 | #include "core/core.h" | ||
| 9 | #include "video_core/memory_manager.h" | ||
| 10 | #include "video_core/renderer_opengl/gl_global_cache.h" | ||
| 11 | #include "video_core/renderer_opengl/gl_rasterizer.h" | ||
| 12 | #include "video_core/renderer_opengl/gl_shader_decompiler.h" | ||
| 13 | #include "video_core/renderer_opengl/utils.h" | ||
| 14 | |||
| 15 | namespace OpenGL { | ||
| 16 | |||
| 17 | CachedGlobalRegion::CachedGlobalRegion(VAddr cpu_addr, u8* host_ptr, u32 size, u32 max_size) | ||
| 18 | : RasterizerCacheObject{host_ptr}, cpu_addr{cpu_addr}, host_ptr{host_ptr}, size{size}, | ||
| 19 | max_size{max_size} { | ||
| 20 | buffer.Create(); | ||
| 21 | LabelGLObject(GL_BUFFER, buffer.handle, cpu_addr, "GlobalMemory"); | ||
| 22 | } | ||
| 23 | |||
| 24 | CachedGlobalRegion::~CachedGlobalRegion() = default; | ||
| 25 | |||
| 26 | void CachedGlobalRegion::Reload(u32 size_) { | ||
| 27 | size = size_; | ||
| 28 | if (size > max_size) { | ||
| 29 | size = max_size; | ||
| 30 | LOG_CRITICAL(HW_GPU, "Global region size {} exceeded the supported size {}!", size_, | ||
| 31 | max_size); | ||
| 32 | } | ||
| 33 | glNamedBufferData(buffer.handle, size, host_ptr, GL_STREAM_DRAW); | ||
| 34 | } | ||
| 35 | |||
| 36 | void CachedGlobalRegion::Flush() { | ||
| 37 | LOG_DEBUG(Render_OpenGL, "Flushing {} bytes to CPU memory address 0x{:16}", size, cpu_addr); | ||
| 38 | glGetNamedBufferSubData(buffer.handle, 0, static_cast<GLsizeiptr>(size), host_ptr); | ||
| 39 | } | ||
| 40 | |||
| 41 | GlobalRegion GlobalRegionCacheOpenGL::TryGetReservedGlobalRegion(CacheAddr addr, u32 size) const { | ||
| 42 | const auto search{reserve.find(addr)}; | ||
| 43 | if (search == reserve.end()) { | ||
| 44 | return {}; | ||
| 45 | } | ||
| 46 | return search->second; | ||
| 47 | } | ||
| 48 | |||
| 49 | GlobalRegion GlobalRegionCacheOpenGL::GetUncachedGlobalRegion(GPUVAddr addr, u8* host_ptr, | ||
| 50 | u32 size) { | ||
| 51 | GlobalRegion region{TryGetReservedGlobalRegion(ToCacheAddr(host_ptr), size)}; | ||
| 52 | if (!region) { | ||
| 53 | // No reserved surface available, create a new one and reserve it | ||
| 54 | auto& memory_manager{Core::System::GetInstance().GPU().MemoryManager()}; | ||
| 55 | const auto cpu_addr{memory_manager.GpuToCpuAddress(addr)}; | ||
| 56 | ASSERT(cpu_addr); | ||
| 57 | |||
| 58 | region = std::make_shared<CachedGlobalRegion>(*cpu_addr, host_ptr, size, max_ssbo_size); | ||
| 59 | ReserveGlobalRegion(region); | ||
| 60 | } | ||
| 61 | region->Reload(size); | ||
| 62 | return region; | ||
| 63 | } | ||
| 64 | |||
| 65 | void GlobalRegionCacheOpenGL::ReserveGlobalRegion(GlobalRegion region) { | ||
| 66 | reserve.insert_or_assign(region->GetCacheAddr(), std::move(region)); | ||
| 67 | } | ||
| 68 | |||
| 69 | GlobalRegionCacheOpenGL::GlobalRegionCacheOpenGL(RasterizerOpenGL& rasterizer) | ||
| 70 | : RasterizerCache{rasterizer} { | ||
| 71 | GLint max_ssbo_size_; | ||
| 72 | glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_ssbo_size_); | ||
| 73 | max_ssbo_size = static_cast<u32>(max_ssbo_size_); | ||
| 74 | } | ||
| 75 | |||
| 76 | GlobalRegion GlobalRegionCacheOpenGL::GetGlobalRegion( | ||
| 77 | const GLShader::GlobalMemoryEntry& global_region, | ||
| 78 | Tegra::Engines::Maxwell3D::Regs::ShaderStage stage) { | ||
| 79 | std::lock_guard lock{mutex}; | ||
| 80 | |||
| 81 | auto& gpu{Core::System::GetInstance().GPU()}; | ||
| 82 | auto& memory_manager{gpu.MemoryManager()}; | ||
| 83 | const auto cbufs{gpu.Maxwell3D().state.shader_stages[static_cast<std::size_t>(stage)]}; | ||
| 84 | const auto addr{cbufs.const_buffers[global_region.GetCbufIndex()].address + | ||
| 85 | global_region.GetCbufOffset()}; | ||
| 86 | const auto actual_addr{memory_manager.Read<u64>(addr)}; | ||
| 87 | const auto size{memory_manager.Read<u32>(addr + 8)}; | ||
| 88 | |||
| 89 | // Look up global region in the cache based on address | ||
| 90 | const auto& host_ptr{memory_manager.GetPointer(actual_addr)}; | ||
| 91 | GlobalRegion region{TryGet(host_ptr)}; | ||
| 92 | |||
| 93 | if (!region) { | ||
| 94 | // No global region found - create a new one | ||
| 95 | region = GetUncachedGlobalRegion(actual_addr, host_ptr, size); | ||
| 96 | Register(region); | ||
| 97 | } | ||
| 98 | |||
| 99 | return region; | ||
| 100 | } | ||
| 101 | |||
| 102 | } // namespace OpenGL | ||
diff --git a/src/video_core/renderer_opengl/gl_global_cache.h b/src/video_core/renderer_opengl/gl_global_cache.h deleted file mode 100644 index 2d467a240..000000000 --- a/src/video_core/renderer_opengl/gl_global_cache.h +++ /dev/null | |||
| @@ -1,82 +0,0 @@ | |||
| 1 | // Copyright 2018 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | #include <unordered_map> | ||
| 9 | |||
| 10 | #include <glad/glad.h> | ||
| 11 | |||
| 12 | #include "common/assert.h" | ||
| 13 | #include "common/common_types.h" | ||
| 14 | #include "video_core/engines/maxwell_3d.h" | ||
| 15 | #include "video_core/rasterizer_cache.h" | ||
| 16 | #include "video_core/renderer_opengl/gl_resource_manager.h" | ||
| 17 | |||
| 18 | namespace OpenGL { | ||
| 19 | |||
| 20 | namespace GLShader { | ||
| 21 | class GlobalMemoryEntry; | ||
| 22 | } | ||
| 23 | |||
| 24 | class RasterizerOpenGL; | ||
| 25 | class CachedGlobalRegion; | ||
| 26 | using GlobalRegion = std::shared_ptr<CachedGlobalRegion>; | ||
| 27 | |||
| 28 | class CachedGlobalRegion final : public RasterizerCacheObject { | ||
| 29 | public: | ||
| 30 | explicit CachedGlobalRegion(VAddr cpu_addr, u8* host_ptr, u32 size, u32 max_size); | ||
| 31 | ~CachedGlobalRegion(); | ||
| 32 | |||
| 33 | VAddr GetCpuAddr() const override { | ||
| 34 | return cpu_addr; | ||
| 35 | } | ||
| 36 | |||
| 37 | std::size_t GetSizeInBytes() const override { | ||
| 38 | return size; | ||
| 39 | } | ||
| 40 | |||
| 41 | /// Gets the GL program handle for the buffer | ||
| 42 | GLuint GetBufferHandle() const { | ||
| 43 | return buffer.handle; | ||
| 44 | } | ||
| 45 | |||
| 46 | /// Reloads the global region from guest memory | ||
| 47 | void Reload(u32 size_); | ||
| 48 | |||
| 49 | void Flush(); | ||
| 50 | |||
| 51 | private: | ||
| 52 | VAddr cpu_addr{}; | ||
| 53 | u8* host_ptr{}; | ||
| 54 | u32 size{}; | ||
| 55 | u32 max_size{}; | ||
| 56 | |||
| 57 | OGLBuffer buffer; | ||
| 58 | }; | ||
| 59 | |||
| 60 | class GlobalRegionCacheOpenGL final : public RasterizerCache<GlobalRegion> { | ||
| 61 | public: | ||
| 62 | explicit GlobalRegionCacheOpenGL(RasterizerOpenGL& rasterizer); | ||
| 63 | |||
| 64 | /// Gets the current specified shader stage program | ||
| 65 | GlobalRegion GetGlobalRegion(const GLShader::GlobalMemoryEntry& descriptor, | ||
| 66 | Tegra::Engines::Maxwell3D::Regs::ShaderStage stage); | ||
| 67 | |||
| 68 | protected: | ||
| 69 | void FlushObjectInner(const GlobalRegion& object) override { | ||
| 70 | object->Flush(); | ||
| 71 | } | ||
| 72 | |||
| 73 | private: | ||
| 74 | GlobalRegion TryGetReservedGlobalRegion(CacheAddr addr, u32 size) const; | ||
| 75 | GlobalRegion GetUncachedGlobalRegion(GPUVAddr addr, u8* host_ptr, u32 size); | ||
| 76 | void ReserveGlobalRegion(GlobalRegion region); | ||
| 77 | |||
| 78 | std::unordered_map<CacheAddr, GlobalRegion> reserve; | ||
| 79 | u32 max_ssbo_size{}; | ||
| 80 | }; | ||
| 81 | |||
| 82 | } // namespace OpenGL | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index e216163e1..d1790f24f 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include "core/hle/kernel/process.h" | 20 | #include "core/hle/kernel/process.h" |
| 21 | #include "core/settings.h" | 21 | #include "core/settings.h" |
| 22 | #include "video_core/engines/maxwell_3d.h" | 22 | #include "video_core/engines/maxwell_3d.h" |
| 23 | #include "video_core/memory_manager.h" | ||
| 23 | #include "video_core/renderer_opengl/gl_rasterizer.h" | 24 | #include "video_core/renderer_opengl/gl_rasterizer.h" |
| 24 | #include "video_core/renderer_opengl/gl_shader_cache.h" | 25 | #include "video_core/renderer_opengl/gl_shader_cache.h" |
| 25 | #include "video_core/renderer_opengl/gl_shader_gen.h" | 26 | #include "video_core/renderer_opengl/gl_shader_gen.h" |
| @@ -82,8 +83,8 @@ struct DrawParameters { | |||
| 82 | 83 | ||
| 83 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, | 84 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, |
| 84 | ScreenInfo& info) | 85 | ScreenInfo& info) |
| 85 | : texture_cache{system, *this, device}, shader_cache{*this, system, emu_window, device}, | 86 | : texture_cache{system, *this, device}, |
| 86 | global_cache{*this}, system{system}, screen_info{info}, | 87 | shader_cache{*this, system, emu_window, device}, system{system}, screen_info{info}, |
| 87 | buffer_cache(*this, STREAM_BUFFER_SIZE) { | 88 | buffer_cache(*this, STREAM_BUFFER_SIZE) { |
| 88 | OpenGLState::ApplyDefaultState(); | 89 | OpenGLState::ApplyDefaultState(); |
| 89 | 90 | ||
| @@ -689,7 +690,7 @@ void RasterizerOpenGL::FlushRegion(CacheAddr addr, u64 size) { | |||
| 689 | return; | 690 | return; |
| 690 | } | 691 | } |
| 691 | texture_cache.FlushRegion(addr, size); | 692 | texture_cache.FlushRegion(addr, size); |
| 692 | global_cache.FlushRegion(addr, size); | 693 | buffer_cache.FlushRegion(addr, size); |
| 693 | } | 694 | } |
| 694 | 695 | ||
| 695 | void RasterizerOpenGL::InvalidateRegion(CacheAddr addr, u64 size) { | 696 | void RasterizerOpenGL::InvalidateRegion(CacheAddr addr, u64 size) { |
| @@ -699,7 +700,6 @@ void RasterizerOpenGL::InvalidateRegion(CacheAddr addr, u64 size) { | |||
| 699 | } | 700 | } |
| 700 | texture_cache.InvalidateRegion(addr, size); | 701 | texture_cache.InvalidateRegion(addr, size); |
| 701 | shader_cache.InvalidateRegion(addr, size); | 702 | shader_cache.InvalidateRegion(addr, size); |
| 702 | global_cache.InvalidateRegion(addr, size); | ||
| 703 | buffer_cache.InvalidateRegion(addr, size); | 703 | buffer_cache.InvalidateRegion(addr, size); |
| 704 | } | 704 | } |
| 705 | 705 | ||
| @@ -797,15 +797,22 @@ void RasterizerOpenGL::SetupConstBuffer(const Tegra::Engines::ConstBufferInfo& b | |||
| 797 | 797 | ||
| 798 | void RasterizerOpenGL::SetupGlobalRegions(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, | 798 | void RasterizerOpenGL::SetupGlobalRegions(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, |
| 799 | const Shader& shader) { | 799 | const Shader& shader) { |
| 800 | auto& gpu{system.GPU()}; | ||
| 801 | auto& memory_manager{gpu.MemoryManager()}; | ||
| 802 | const auto cbufs{gpu.Maxwell3D().state.shader_stages[static_cast<std::size_t>(stage)]}; | ||
| 803 | const auto alignment{device.GetShaderStorageBufferAlignment()}; | ||
| 804 | |||
| 800 | const auto& entries = shader->GetShaderEntries().global_memory_entries; | 805 | const auto& entries = shader->GetShaderEntries().global_memory_entries; |
| 801 | for (std::size_t bindpoint = 0; bindpoint < entries.size(); ++bindpoint) { | 806 | for (std::size_t bindpoint = 0; bindpoint < entries.size(); ++bindpoint) { |
| 802 | const auto& entry{entries[bindpoint]}; | 807 | const auto& entry{entries[bindpoint]}; |
| 803 | const auto& region{global_cache.GetGlobalRegion(entry, stage)}; | 808 | |
| 804 | if (entry.IsWritten()) { | 809 | const auto addr{cbufs.const_buffers[entry.GetCbufIndex()].address + entry.GetCbufOffset()}; |
| 805 | region->MarkAsModified(true, global_cache); | 810 | const auto actual_addr{memory_manager.Read<u64>(addr)}; |
| 806 | } | 811 | const auto size{memory_manager.Read<u32>(addr + 8)}; |
| 807 | bind_ssbo_pushbuffer.Push(region->GetBufferHandle(), 0, | 812 | |
| 808 | static_cast<GLsizeiptr>(region->GetSizeInBytes())); | 813 | const auto [ssbo, buffer_offset] = |
| 814 | buffer_cache.UploadMemory(actual_addr, size, alignment, true, entry.IsWritten()); | ||
| 815 | bind_ssbo_pushbuffer.Push(ssbo, buffer_offset, static_cast<GLsizeiptr>(size)); | ||
| 809 | } | 816 | } |
| 810 | } | 817 | } |
| 811 | 818 | ||
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index a03bc759f..bc988727b 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #include "video_core/renderer_opengl/gl_buffer_cache.h" | 24 | #include "video_core/renderer_opengl/gl_buffer_cache.h" |
| 25 | #include "video_core/renderer_opengl/gl_device.h" | 25 | #include "video_core/renderer_opengl/gl_device.h" |
| 26 | #include "video_core/renderer_opengl/gl_framebuffer_cache.h" | 26 | #include "video_core/renderer_opengl/gl_framebuffer_cache.h" |
| 27 | #include "video_core/renderer_opengl/gl_global_cache.h" | ||
| 28 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 27 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 29 | #include "video_core/renderer_opengl/gl_sampler_cache.h" | 28 | #include "video_core/renderer_opengl/gl_sampler_cache.h" |
| 30 | #include "video_core/renderer_opengl/gl_shader_cache.h" | 29 | #include "video_core/renderer_opengl/gl_shader_cache.h" |
| @@ -189,7 +188,6 @@ private: | |||
| 189 | 188 | ||
| 190 | TextureCacheOpenGL texture_cache; | 189 | TextureCacheOpenGL texture_cache; |
| 191 | ShaderCacheOpenGL shader_cache; | 190 | ShaderCacheOpenGL shader_cache; |
| 192 | GlobalRegionCacheOpenGL global_cache; | ||
| 193 | SamplerCacheOpenGL sampler_cache; | 191 | SamplerCacheOpenGL sampler_cache; |
| 194 | FramebufferCacheOpenGL framebuffer_cache; | 192 | FramebufferCacheOpenGL framebuffer_cache; |
| 195 | 193 | ||