gl_rasterizer: Drop gl_global_cache in favor of gl_buffer_cache
This commit is contained in:
		| @@ -43,8 +43,6 @@ add_library(video_core STATIC | ||||
|     renderer_opengl/gl_device.h | ||||
|     renderer_opengl/gl_framebuffer_cache.cpp | ||||
|     renderer_opengl/gl_framebuffer_cache.h | ||||
|     renderer_opengl/gl_global_cache.cpp | ||||
|     renderer_opengl/gl_global_cache.h | ||||
|     renderer_opengl/gl_rasterizer.cpp | ||||
|     renderer_opengl/gl_rasterizer.h | ||||
|     renderer_opengl/gl_resource_manager.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); | ||||
|     } | ||||
|   | ||||
| @@ -82,7 +82,7 @@ public: | ||||
|     /// Uploads data from a guest GPU address. Returns the OpenGL buffer where it's located and its | ||||
|     /// offset. | ||||
|     BufferInfo UploadMemory(GPUVAddr gpu_addr, std::size_t size, std::size_t alignment = 4, | ||||
|                             bool internalize = false); | ||||
|                             bool internalize = false, bool is_written = false); | ||||
|  | ||||
|     /// Uploads from a host memory. Returns the OpenGL buffer where it's located and its offset. | ||||
|     BufferInfo UploadHostMemory(const void* raw_pointer, std::size_t size, | ||||
| @@ -99,7 +99,7 @@ private: | ||||
|     BufferInfo StreamBufferUpload(const void* raw_pointer, std::size_t size, std::size_t alignment); | ||||
|  | ||||
|     BufferInfo FixedBufferUpload(GPUVAddr gpu_addr, u8* host_ptr, std::size_t size, | ||||
|                                  bool internalize); | ||||
|                                  bool internalize, bool is_written); | ||||
|  | ||||
|     void GrowBuffer(std::shared_ptr<CachedBufferEntry>& entry, std::size_t new_size); | ||||
|  | ||||
|   | ||||
| @@ -1,102 +0,0 @@ | ||||
| // Copyright 2018 yuzu Emulator Project | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #include <glad/glad.h> | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "video_core/memory_manager.h" | ||||
| #include "video_core/renderer_opengl/gl_global_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_rasterizer.h" | ||||
| #include "video_core/renderer_opengl/gl_shader_decompiler.h" | ||||
| #include "video_core/renderer_opengl/utils.h" | ||||
|  | ||||
| namespace OpenGL { | ||||
|  | ||||
| CachedGlobalRegion::CachedGlobalRegion(VAddr cpu_addr, u8* host_ptr, u32 size, u32 max_size) | ||||
|     : RasterizerCacheObject{host_ptr}, cpu_addr{cpu_addr}, host_ptr{host_ptr}, size{size}, | ||||
|       max_size{max_size} { | ||||
|     buffer.Create(); | ||||
|     LabelGLObject(GL_BUFFER, buffer.handle, cpu_addr, "GlobalMemory"); | ||||
| } | ||||
|  | ||||
| CachedGlobalRegion::~CachedGlobalRegion() = default; | ||||
|  | ||||
| void CachedGlobalRegion::Reload(u32 size_) { | ||||
|     size = size_; | ||||
|     if (size > max_size) { | ||||
|         size = max_size; | ||||
|         LOG_CRITICAL(HW_GPU, "Global region size {} exceeded the supported size {}!", size_, | ||||
|                      max_size); | ||||
|     } | ||||
|     glNamedBufferData(buffer.handle, size, host_ptr, GL_STREAM_DRAW); | ||||
| } | ||||
|  | ||||
| void CachedGlobalRegion::Flush() { | ||||
|     LOG_DEBUG(Render_OpenGL, "Flushing {} bytes to CPU memory address 0x{:16}", size, cpu_addr); | ||||
|     glGetNamedBufferSubData(buffer.handle, 0, static_cast<GLsizeiptr>(size), host_ptr); | ||||
| } | ||||
|  | ||||
| GlobalRegion GlobalRegionCacheOpenGL::TryGetReservedGlobalRegion(CacheAddr addr, u32 size) const { | ||||
|     const auto search{reserve.find(addr)}; | ||||
|     if (search == reserve.end()) { | ||||
|         return {}; | ||||
|     } | ||||
|     return search->second; | ||||
| } | ||||
|  | ||||
| GlobalRegion GlobalRegionCacheOpenGL::GetUncachedGlobalRegion(GPUVAddr addr, u8* host_ptr, | ||||
|                                                               u32 size) { | ||||
|     GlobalRegion region{TryGetReservedGlobalRegion(ToCacheAddr(host_ptr), size)}; | ||||
|     if (!region) { | ||||
|         // No reserved surface available, create a new one and reserve it | ||||
|         auto& memory_manager{Core::System::GetInstance().GPU().MemoryManager()}; | ||||
|         const auto cpu_addr{memory_manager.GpuToCpuAddress(addr)}; | ||||
|         ASSERT(cpu_addr); | ||||
|  | ||||
|         region = std::make_shared<CachedGlobalRegion>(*cpu_addr, host_ptr, size, max_ssbo_size); | ||||
|         ReserveGlobalRegion(region); | ||||
|     } | ||||
|     region->Reload(size); | ||||
|     return region; | ||||
| } | ||||
|  | ||||
| void GlobalRegionCacheOpenGL::ReserveGlobalRegion(GlobalRegion region) { | ||||
|     reserve.insert_or_assign(region->GetCacheAddr(), std::move(region)); | ||||
| } | ||||
|  | ||||
| GlobalRegionCacheOpenGL::GlobalRegionCacheOpenGL(RasterizerOpenGL& rasterizer) | ||||
|     : RasterizerCache{rasterizer} { | ||||
|     GLint max_ssbo_size_; | ||||
|     glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_ssbo_size_); | ||||
|     max_ssbo_size = static_cast<u32>(max_ssbo_size_); | ||||
| } | ||||
|  | ||||
| GlobalRegion GlobalRegionCacheOpenGL::GetGlobalRegion( | ||||
|     const GLShader::GlobalMemoryEntry& global_region, | ||||
|     Tegra::Engines::Maxwell3D::Regs::ShaderStage stage) { | ||||
|     std::lock_guard lock{mutex}; | ||||
|  | ||||
|     auto& gpu{Core::System::GetInstance().GPU()}; | ||||
|     auto& memory_manager{gpu.MemoryManager()}; | ||||
|     const auto cbufs{gpu.Maxwell3D().state.shader_stages[static_cast<std::size_t>(stage)]}; | ||||
|     const auto addr{cbufs.const_buffers[global_region.GetCbufIndex()].address + | ||||
|                     global_region.GetCbufOffset()}; | ||||
|     const auto actual_addr{memory_manager.Read<u64>(addr)}; | ||||
|     const auto size{memory_manager.Read<u32>(addr + 8)}; | ||||
|  | ||||
|     // Look up global region in the cache based on address | ||||
|     const auto& host_ptr{memory_manager.GetPointer(actual_addr)}; | ||||
|     GlobalRegion region{TryGet(host_ptr)}; | ||||
|  | ||||
|     if (!region) { | ||||
|         // No global region found - create a new one | ||||
|         region = GetUncachedGlobalRegion(actual_addr, host_ptr, size); | ||||
|         Register(region); | ||||
|     } | ||||
|  | ||||
|     return region; | ||||
| } | ||||
|  | ||||
| } // namespace OpenGL | ||||
| @@ -1,82 +0,0 @@ | ||||
| // Copyright 2018 yuzu Emulator Project | ||||
| // Licensed under GPLv2 or any later version | ||||
| // Refer to the license.txt file included. | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
| #include <unordered_map> | ||||
|  | ||||
| #include <glad/glad.h> | ||||
|  | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "video_core/engines/maxwell_3d.h" | ||||
| #include "video_core/rasterizer_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_resource_manager.h" | ||||
|  | ||||
| namespace OpenGL { | ||||
|  | ||||
| namespace GLShader { | ||||
| class GlobalMemoryEntry; | ||||
| } | ||||
|  | ||||
| class RasterizerOpenGL; | ||||
| class CachedGlobalRegion; | ||||
| using GlobalRegion = std::shared_ptr<CachedGlobalRegion>; | ||||
|  | ||||
| class CachedGlobalRegion final : public RasterizerCacheObject { | ||||
| public: | ||||
|     explicit CachedGlobalRegion(VAddr cpu_addr, u8* host_ptr, u32 size, u32 max_size); | ||||
|     ~CachedGlobalRegion(); | ||||
|  | ||||
|     VAddr GetCpuAddr() const override { | ||||
|         return cpu_addr; | ||||
|     } | ||||
|  | ||||
|     std::size_t GetSizeInBytes() const override { | ||||
|         return size; | ||||
|     } | ||||
|  | ||||
|     /// Gets the GL program handle for the buffer | ||||
|     GLuint GetBufferHandle() const { | ||||
|         return buffer.handle; | ||||
|     } | ||||
|  | ||||
|     /// Reloads the global region from guest memory | ||||
|     void Reload(u32 size_); | ||||
|  | ||||
|     void Flush(); | ||||
|  | ||||
| private: | ||||
|     VAddr cpu_addr{}; | ||||
|     u8* host_ptr{}; | ||||
|     u32 size{}; | ||||
|     u32 max_size{}; | ||||
|  | ||||
|     OGLBuffer buffer; | ||||
| }; | ||||
|  | ||||
| class GlobalRegionCacheOpenGL final : public RasterizerCache<GlobalRegion> { | ||||
| public: | ||||
|     explicit GlobalRegionCacheOpenGL(RasterizerOpenGL& rasterizer); | ||||
|  | ||||
|     /// Gets the current specified shader stage program | ||||
|     GlobalRegion GetGlobalRegion(const GLShader::GlobalMemoryEntry& descriptor, | ||||
|                                  Tegra::Engines::Maxwell3D::Regs::ShaderStage stage); | ||||
|  | ||||
| protected: | ||||
|     void FlushObjectInner(const GlobalRegion& object) override { | ||||
|         object->Flush(); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     GlobalRegion TryGetReservedGlobalRegion(CacheAddr addr, u32 size) const; | ||||
|     GlobalRegion GetUncachedGlobalRegion(GPUVAddr addr, u8* host_ptr, u32 size); | ||||
|     void ReserveGlobalRegion(GlobalRegion region); | ||||
|  | ||||
|     std::unordered_map<CacheAddr, GlobalRegion> reserve; | ||||
|     u32 max_ssbo_size{}; | ||||
| }; | ||||
|  | ||||
| } // namespace OpenGL | ||||
| @@ -20,6 +20,7 @@ | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/settings.h" | ||||
| #include "video_core/engines/maxwell_3d.h" | ||||
| #include "video_core/memory_manager.h" | ||||
| #include "video_core/renderer_opengl/gl_rasterizer.h" | ||||
| #include "video_core/renderer_opengl/gl_shader_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_shader_gen.h" | ||||
| @@ -82,8 +83,8 @@ struct DrawParameters { | ||||
|  | ||||
| RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, | ||||
|                                    ScreenInfo& info) | ||||
|     : texture_cache{system, *this, device}, shader_cache{*this, system, emu_window, device}, | ||||
|       global_cache{*this}, system{system}, screen_info{info}, | ||||
|     : texture_cache{system, *this, device}, | ||||
|       shader_cache{*this, system, emu_window, device}, system{system}, screen_info{info}, | ||||
|       buffer_cache(*this, STREAM_BUFFER_SIZE) { | ||||
|     OpenGLState::ApplyDefaultState(); | ||||
|  | ||||
| @@ -689,7 +690,7 @@ void RasterizerOpenGL::FlushRegion(CacheAddr addr, u64 size) { | ||||
|         return; | ||||
|     } | ||||
|     texture_cache.FlushRegion(addr, size); | ||||
|     global_cache.FlushRegion(addr, size); | ||||
|     buffer_cache.FlushRegion(addr, size); | ||||
| } | ||||
|  | ||||
| void RasterizerOpenGL::InvalidateRegion(CacheAddr addr, u64 size) { | ||||
| @@ -699,7 +700,6 @@ void RasterizerOpenGL::InvalidateRegion(CacheAddr addr, u64 size) { | ||||
|     } | ||||
|     texture_cache.InvalidateRegion(addr, size); | ||||
|     shader_cache.InvalidateRegion(addr, size); | ||||
|     global_cache.InvalidateRegion(addr, size); | ||||
|     buffer_cache.InvalidateRegion(addr, size); | ||||
| } | ||||
|  | ||||
| @@ -797,15 +797,22 @@ void RasterizerOpenGL::SetupConstBuffer(const Tegra::Engines::ConstBufferInfo& b | ||||
|  | ||||
| void RasterizerOpenGL::SetupGlobalRegions(Tegra::Engines::Maxwell3D::Regs::ShaderStage stage, | ||||
|                                           const Shader& shader) { | ||||
|     auto& gpu{system.GPU()}; | ||||
|     auto& memory_manager{gpu.MemoryManager()}; | ||||
|     const auto cbufs{gpu.Maxwell3D().state.shader_stages[static_cast<std::size_t>(stage)]}; | ||||
|     const auto alignment{device.GetShaderStorageBufferAlignment()}; | ||||
|  | ||||
|     const auto& entries = shader->GetShaderEntries().global_memory_entries; | ||||
|     for (std::size_t bindpoint = 0; bindpoint < entries.size(); ++bindpoint) { | ||||
|         const auto& entry{entries[bindpoint]}; | ||||
|         const auto& region{global_cache.GetGlobalRegion(entry, stage)}; | ||||
|         if (entry.IsWritten()) { | ||||
|             region->MarkAsModified(true, global_cache); | ||||
|         } | ||||
|         bind_ssbo_pushbuffer.Push(region->GetBufferHandle(), 0, | ||||
|                                   static_cast<GLsizeiptr>(region->GetSizeInBytes())); | ||||
|  | ||||
|         const auto addr{cbufs.const_buffers[entry.GetCbufIndex()].address + entry.GetCbufOffset()}; | ||||
|         const auto actual_addr{memory_manager.Read<u64>(addr)}; | ||||
|         const auto size{memory_manager.Read<u32>(addr + 8)}; | ||||
|  | ||||
|         const auto [ssbo, buffer_offset] = | ||||
|             buffer_cache.UploadMemory(actual_addr, size, alignment, true, entry.IsWritten()); | ||||
|         bind_ssbo_pushbuffer.Push(ssbo, buffer_offset, static_cast<GLsizeiptr>(size)); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -24,7 +24,6 @@ | ||||
| #include "video_core/renderer_opengl/gl_buffer_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_device.h" | ||||
| #include "video_core/renderer_opengl/gl_framebuffer_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_global_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_resource_manager.h" | ||||
| #include "video_core/renderer_opengl/gl_sampler_cache.h" | ||||
| #include "video_core/renderer_opengl/gl_shader_cache.h" | ||||
| @@ -189,7 +188,6 @@ private: | ||||
|  | ||||
|     TextureCacheOpenGL texture_cache; | ||||
|     ShaderCacheOpenGL shader_cache; | ||||
|     GlobalRegionCacheOpenGL global_cache; | ||||
|     SamplerCacheOpenGL sampler_cache; | ||||
|     FramebufferCacheOpenGL framebuffer_cache; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ReinUsesLisp
					ReinUsesLisp