diff options
| author | 2023-12-25 07:32:16 +0100 | |
|---|---|---|
| committer | 2024-01-18 21:12:30 -0500 | |
| commit | 0a2536a0df1f4aea406f2132d3edda0430acc9d1 (patch) | |
| tree | c0ad53890581c9c7e180c5ccb3b66e3c63e3ba64 /src/video_core/renderer_opengl | |
| parent | SMMU: Implement backing CPU page protect/unprotect (diff) | |
| download | yuzu-0a2536a0df1f4aea406f2132d3edda0430acc9d1.tar.gz yuzu-0a2536a0df1f4aea406f2132d3edda0430acc9d1.tar.xz yuzu-0a2536a0df1f4aea406f2132d3edda0430acc9d1.zip | |
SMMU: Initial adaptation to video_core.
Diffstat (limited to 'src/video_core/renderer_opengl')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.cpp | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_buffer_cache.h | 7 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_query_cache.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_query_cache.h | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.cpp | 38 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_rasterizer.h | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_cache.h | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.cpp | 9 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/renderer_opengl.h | 4 |
10 files changed, 61 insertions, 57 deletions
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.cpp b/src/video_core/renderer_opengl/gl_buffer_cache.cpp index 517ac14dd..ade72e1f9 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.cpp +++ b/src/video_core/renderer_opengl/gl_buffer_cache.cpp | |||
| @@ -47,11 +47,10 @@ constexpr std::array PROGRAM_LUT{ | |||
| 47 | } // Anonymous namespace | 47 | } // Anonymous namespace |
| 48 | 48 | ||
| 49 | Buffer::Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params) | 49 | Buffer::Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params) |
| 50 | : VideoCommon::BufferBase<VideoCore::RasterizerInterface>(null_params) {} | 50 | : VideoCommon::BufferBase(null_params) {} |
| 51 | 51 | ||
| 52 | Buffer::Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rasterizer_, | 52 | Buffer::Buffer(BufferCacheRuntime& runtime, DAddr cpu_addr_, u64 size_bytes_) |
| 53 | VAddr cpu_addr_, u64 size_bytes_) | 53 | : VideoCommon::BufferBase(cpu_addr_, size_bytes_) { |
| 54 | : VideoCommon::BufferBase<VideoCore::RasterizerInterface>(rasterizer_, cpu_addr_, size_bytes_) { | ||
| 55 | buffer.Create(); | 54 | buffer.Create(); |
| 56 | if (runtime.device.HasDebuggingToolAttached()) { | 55 | if (runtime.device.HasDebuggingToolAttached()) { |
| 57 | const std::string name = fmt::format("Buffer 0x{:x}", CpuAddr()); | 56 | const std::string name = fmt::format("Buffer 0x{:x}", CpuAddr()); |
diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index 2c18de166..e6ad030cb 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h | |||
| @@ -10,7 +10,6 @@ | |||
| 10 | #include "common/common_types.h" | 10 | #include "common/common_types.h" |
| 11 | #include "video_core/buffer_cache/buffer_cache_base.h" | 11 | #include "video_core/buffer_cache/buffer_cache_base.h" |
| 12 | #include "video_core/buffer_cache/memory_tracker_base.h" | 12 | #include "video_core/buffer_cache/memory_tracker_base.h" |
| 13 | #include "video_core/rasterizer_interface.h" | ||
| 14 | #include "video_core/renderer_opengl/gl_device.h" | 13 | #include "video_core/renderer_opengl/gl_device.h" |
| 15 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 14 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 16 | #include "video_core/renderer_opengl/gl_staging_buffer_pool.h" | 15 | #include "video_core/renderer_opengl/gl_staging_buffer_pool.h" |
| @@ -19,9 +18,9 @@ namespace OpenGL { | |||
| 19 | 18 | ||
| 20 | class BufferCacheRuntime; | 19 | class BufferCacheRuntime; |
| 21 | 20 | ||
| 22 | class Buffer : public VideoCommon::BufferBase<VideoCore::RasterizerInterface> { | 21 | class Buffer : public VideoCommon::BufferBase { |
| 23 | public: | 22 | public: |
| 24 | explicit Buffer(BufferCacheRuntime&, VideoCore::RasterizerInterface& rasterizer, VAddr cpu_addr, | 23 | explicit Buffer(BufferCacheRuntime&, DAddr cpu_addr, |
| 25 | u64 size_bytes); | 24 | u64 size_bytes); |
| 26 | explicit Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams); | 25 | explicit Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams); |
| 27 | 26 | ||
| @@ -244,7 +243,7 @@ struct BufferCacheParams { | |||
| 244 | using Runtime = OpenGL::BufferCacheRuntime; | 243 | using Runtime = OpenGL::BufferCacheRuntime; |
| 245 | using Buffer = OpenGL::Buffer; | 244 | using Buffer = OpenGL::Buffer; |
| 246 | using Async_Buffer = OpenGL::StagingBufferMap; | 245 | using Async_Buffer = OpenGL::StagingBufferMap; |
| 247 | using MemoryTracker = VideoCommon::MemoryTrackerBase<VideoCore::RasterizerInterface>; | 246 | using MemoryTracker = VideoCommon::MemoryTrackerBase<Tegra::MaxwellDeviceMemoryManager>; |
| 248 | 247 | ||
| 249 | static constexpr bool IS_OPENGL = true; | 248 | static constexpr bool IS_OPENGL = true; |
| 250 | static constexpr bool HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS = true; | 249 | static constexpr bool HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS = true; |
diff --git a/src/video_core/renderer_opengl/gl_query_cache.cpp b/src/video_core/renderer_opengl/gl_query_cache.cpp index fef7360ed..567292e1c 100644 --- a/src/video_core/renderer_opengl/gl_query_cache.cpp +++ b/src/video_core/renderer_opengl/gl_query_cache.cpp | |||
| @@ -35,8 +35,8 @@ constexpr GLenum GetTarget(VideoCore::QueryType type) { | |||
| 35 | 35 | ||
| 36 | } // Anonymous namespace | 36 | } // Anonymous namespace |
| 37 | 37 | ||
| 38 | QueryCache::QueryCache(RasterizerOpenGL& rasterizer_, Core::Memory::Memory& cpu_memory_) | 38 | QueryCache::QueryCache(RasterizerOpenGL& rasterizer_, Tegra::MaxwellDeviceMemoryManager& device_memory_) |
| 39 | : QueryCacheLegacy(rasterizer_, cpu_memory_), gl_rasterizer{rasterizer_} { | 39 | : QueryCacheLegacy(rasterizer_, device_memory_), gl_rasterizer{rasterizer_} { |
| 40 | EnableCounters(); | 40 | EnableCounters(); |
| 41 | } | 41 | } |
| 42 | 42 | ||
diff --git a/src/video_core/renderer_opengl/gl_query_cache.h b/src/video_core/renderer_opengl/gl_query_cache.h index 0721e0b3d..04a1b39c9 100644 --- a/src/video_core/renderer_opengl/gl_query_cache.h +++ b/src/video_core/renderer_opengl/gl_query_cache.h | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include "video_core/query_cache.h" | 11 | #include "video_core/query_cache.h" |
| 12 | #include "video_core/rasterizer_interface.h" | 12 | #include "video_core/rasterizer_interface.h" |
| 13 | #include "video_core/renderer_opengl/gl_resource_manager.h" | 13 | #include "video_core/renderer_opengl/gl_resource_manager.h" |
| 14 | #include "video_core/host1x/gpu_device_memory_manager.h" | ||
| 14 | 15 | ||
| 15 | namespace Core { | 16 | namespace Core { |
| 16 | class System; | 17 | class System; |
| @@ -28,7 +29,7 @@ using CounterStream = VideoCommon::CounterStreamBase<QueryCache, HostCounter>; | |||
| 28 | class QueryCache final | 29 | class QueryCache final |
| 29 | : public VideoCommon::QueryCacheLegacy<QueryCache, CachedQuery, CounterStream, HostCounter> { | 30 | : public VideoCommon::QueryCacheLegacy<QueryCache, CachedQuery, CounterStream, HostCounter> { |
| 30 | public: | 31 | public: |
| 31 | explicit QueryCache(RasterizerOpenGL& rasterizer_, Core::Memory::Memory& cpu_memory_); | 32 | explicit QueryCache(RasterizerOpenGL& rasterizer_, Tegra::MaxwellDeviceMemoryManager& device_memory_); |
| 32 | ~QueryCache(); | 33 | ~QueryCache(); |
| 33 | 34 | ||
| 34 | OGLQuery AllocateQuery(VideoCore::QueryType type); | 35 | OGLQuery AllocateQuery(VideoCore::QueryType type); |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 7a5fad735..ca31e2fbd 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -70,18 +70,18 @@ std::optional<VideoCore::QueryType> MaxwellToVideoCoreQuery(VideoCommon::QueryTy | |||
| 70 | } // Anonymous namespace | 70 | } // Anonymous namespace |
| 71 | 71 | ||
| 72 | RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, | 72 | RasterizerOpenGL::RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, |
| 73 | Core::Memory::Memory& cpu_memory_, const Device& device_, | 73 | Tegra::MaxwellDeviceMemoryManager& device_memory_, |
| 74 | ScreenInfo& screen_info_, ProgramManager& program_manager_, | 74 | const Device& device_, ScreenInfo& screen_info_, |
| 75 | StateTracker& state_tracker_) | 75 | ProgramManager& program_manager_, StateTracker& state_tracker_) |
| 76 | : RasterizerAccelerated(cpu_memory_), gpu(gpu_), device(device_), screen_info(screen_info_), | 76 | : gpu(gpu_), device_memory(device_memory_), device(device_), screen_info(screen_info_), |
| 77 | program_manager(program_manager_), state_tracker(state_tracker_), | 77 | program_manager(program_manager_), state_tracker(state_tracker_), |
| 78 | texture_cache_runtime(device, program_manager, state_tracker, staging_buffer_pool), | 78 | texture_cache_runtime(device, program_manager, state_tracker, staging_buffer_pool), |
| 79 | texture_cache(texture_cache_runtime, *this), | 79 | texture_cache(texture_cache_runtime, device_memory_), |
| 80 | buffer_cache_runtime(device, staging_buffer_pool), | 80 | buffer_cache_runtime(device, staging_buffer_pool), |
| 81 | buffer_cache(*this, cpu_memory_, buffer_cache_runtime), | 81 | buffer_cache(device_memory_, buffer_cache_runtime), |
| 82 | shader_cache(*this, emu_window_, device, texture_cache, buffer_cache, program_manager, | 82 | shader_cache(device_memory_, emu_window_, device, texture_cache, buffer_cache, |
| 83 | state_tracker, gpu.ShaderNotify()), | 83 | program_manager, state_tracker, gpu.ShaderNotify()), |
| 84 | query_cache(*this, cpu_memory_), accelerate_dma(buffer_cache, texture_cache), | 84 | query_cache(*this, device_memory_), accelerate_dma(buffer_cache, texture_cache), |
| 85 | fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache), | 85 | fence_manager(*this, gpu, texture_cache, buffer_cache, query_cache), |
| 86 | blit_image(program_manager_) {} | 86 | blit_image(program_manager_) {} |
| 87 | 87 | ||
| @@ -475,7 +475,7 @@ void RasterizerOpenGL::DisableGraphicsUniformBuffer(size_t stage, u32 index) { | |||
| 475 | 475 | ||
| 476 | void RasterizerOpenGL::FlushAll() {} | 476 | void RasterizerOpenGL::FlushAll() {} |
| 477 | 477 | ||
| 478 | void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { | 478 | void RasterizerOpenGL::FlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { |
| 479 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 479 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 480 | if (addr == 0 || size == 0) { | 480 | if (addr == 0 || size == 0) { |
| 481 | return; | 481 | return; |
| @@ -493,7 +493,7 @@ void RasterizerOpenGL::FlushRegion(VAddr addr, u64 size, VideoCommon::CacheType | |||
| 493 | } | 493 | } |
| 494 | } | 494 | } |
| 495 | 495 | ||
| 496 | bool RasterizerOpenGL::MustFlushRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { | 496 | bool RasterizerOpenGL::MustFlushRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { |
| 497 | if ((True(which & VideoCommon::CacheType::BufferCache))) { | 497 | if ((True(which & VideoCommon::CacheType::BufferCache))) { |
| 498 | std::scoped_lock lock{buffer_cache.mutex}; | 498 | std::scoped_lock lock{buffer_cache.mutex}; |
| 499 | if (buffer_cache.IsRegionGpuModified(addr, size)) { | 499 | if (buffer_cache.IsRegionGpuModified(addr, size)) { |
| @@ -510,7 +510,7 @@ bool RasterizerOpenGL::MustFlushRegion(VAddr addr, u64 size, VideoCommon::CacheT | |||
| 510 | return false; | 510 | return false; |
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | VideoCore::RasterizerDownloadArea RasterizerOpenGL::GetFlushArea(VAddr addr, u64 size) { | 513 | VideoCore::RasterizerDownloadArea RasterizerOpenGL::GetFlushArea(DAddr addr, u64 size) { |
| 514 | { | 514 | { |
| 515 | std::scoped_lock lock{texture_cache.mutex}; | 515 | std::scoped_lock lock{texture_cache.mutex}; |
| 516 | auto area = texture_cache.GetFlushArea(addr, size); | 516 | auto area = texture_cache.GetFlushArea(addr, size); |
| @@ -533,7 +533,7 @@ VideoCore::RasterizerDownloadArea RasterizerOpenGL::GetFlushArea(VAddr addr, u64 | |||
| 533 | return new_area; | 533 | return new_area; |
| 534 | } | 534 | } |
| 535 | 535 | ||
| 536 | void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size, VideoCommon::CacheType which) { | 536 | void RasterizerOpenGL::InvalidateRegion(DAddr addr, u64 size, VideoCommon::CacheType which) { |
| 537 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 537 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 538 | if (addr == 0 || size == 0) { | 538 | if (addr == 0 || size == 0) { |
| 539 | return; | 539 | return; |
| @@ -554,8 +554,9 @@ void RasterizerOpenGL::InvalidateRegion(VAddr addr, u64 size, VideoCommon::Cache | |||
| 554 | } | 554 | } |
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | bool RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { | 557 | bool RasterizerOpenGL::OnCPUWrite(PAddr p_addr, u64 size) { |
| 558 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 558 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 559 | const DAddr addr = device_memory.GetAddressFromPAddr(p_addr); | ||
| 559 | if (addr == 0 || size == 0) { | 560 | if (addr == 0 || size == 0) { |
| 560 | return false; | 561 | return false; |
| 561 | } | 562 | } |
| @@ -576,8 +577,9 @@ bool RasterizerOpenGL::OnCPUWrite(VAddr addr, u64 size) { | |||
| 576 | return false; | 577 | return false; |
| 577 | } | 578 | } |
| 578 | 579 | ||
| 579 | void RasterizerOpenGL::OnCacheInvalidation(VAddr addr, u64 size) { | 580 | void RasterizerOpenGL::OnCacheInvalidation(PAddr p_addr, u64 size) { |
| 580 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); | 581 | MICROPROFILE_SCOPE(OpenGL_CacheManagement); |
| 582 | const DAddr addr = device_memory.GetAddressFromPAddr(p_addr); | ||
| 581 | if (addr == 0 || size == 0) { | 583 | if (addr == 0 || size == 0) { |
| 582 | return; | 584 | return; |
| 583 | } | 585 | } |
| @@ -596,7 +598,7 @@ void RasterizerOpenGL::InvalidateGPUCache() { | |||
| 596 | gpu.InvalidateGPUCache(); | 598 | gpu.InvalidateGPUCache(); |
| 597 | } | 599 | } |
| 598 | 600 | ||
| 599 | void RasterizerOpenGL::UnmapMemory(VAddr addr, u64 size) { | 601 | void RasterizerOpenGL::UnmapMemory(DAddr addr, u64 size) { |
| 600 | { | 602 | { |
| 601 | std::scoped_lock lock{texture_cache.mutex}; | 603 | std::scoped_lock lock{texture_cache.mutex}; |
| 602 | texture_cache.UnmapMemory(addr, size); | 604 | texture_cache.UnmapMemory(addr, size); |
| @@ -635,7 +637,7 @@ void RasterizerOpenGL::ReleaseFences(bool force) { | |||
| 635 | fence_manager.WaitPendingFences(force); | 637 | fence_manager.WaitPendingFences(force); |
| 636 | } | 638 | } |
| 637 | 639 | ||
| 638 | void RasterizerOpenGL::FlushAndInvalidateRegion(VAddr addr, u64 size, | 640 | void RasterizerOpenGL::FlushAndInvalidateRegion(DAddr addr, u64 size, |
| 639 | VideoCommon::CacheType which) { | 641 | VideoCommon::CacheType which) { |
| 640 | if (Settings::IsGPULevelExtreme()) { | 642 | if (Settings::IsGPULevelExtreme()) { |
| 641 | FlushRegion(addr, size, which); | 643 | FlushRegion(addr, size, which); |
| @@ -739,7 +741,7 @@ void RasterizerOpenGL::AccelerateInlineToMemory(GPUVAddr address, size_t copy_si | |||
| 739 | } | 741 | } |
| 740 | 742 | ||
| 741 | bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config, | 743 | bool RasterizerOpenGL::AccelerateDisplay(const Tegra::FramebufferConfig& config, |
| 742 | VAddr framebuffer_addr, u32 pixel_stride) { | 744 | DAddr framebuffer_addr, u32 pixel_stride) { |
| 743 | if (framebuffer_addr == 0) { | 745 | if (framebuffer_addr == 0) { |
| 744 | return false; | 746 | return false; |
| 745 | } | 747 | } |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index ce3460938..f197774ed 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #include "common/common_types.h" | 14 | #include "common/common_types.h" |
| 15 | #include "video_core/control/channel_state_cache.h" | 15 | #include "video_core/control/channel_state_cache.h" |
| 16 | #include "video_core/engines/maxwell_dma.h" | 16 | #include "video_core/engines/maxwell_dma.h" |
| 17 | #include "video_core/rasterizer_accelerated.h" | ||
| 18 | #include "video_core/rasterizer_interface.h" | 17 | #include "video_core/rasterizer_interface.h" |
| 19 | #include "video_core/renderer_opengl/blit_image.h" | 18 | #include "video_core/renderer_opengl/blit_image.h" |
| 20 | #include "video_core/renderer_opengl/gl_buffer_cache.h" | 19 | #include "video_core/renderer_opengl/gl_buffer_cache.h" |
| @@ -72,11 +71,11 @@ private: | |||
| 72 | TextureCache& texture_cache; | 71 | TextureCache& texture_cache; |
| 73 | }; | 72 | }; |
| 74 | 73 | ||
| 75 | class RasterizerOpenGL : public VideoCore::RasterizerAccelerated, | 74 | class RasterizerOpenGL : public VideoCore::RasterizerInterface, |
| 76 | protected VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> { | 75 | protected VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> { |
| 77 | public: | 76 | public: |
| 78 | explicit RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, | 77 | explicit RasterizerOpenGL(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_, |
| 79 | Core::Memory::Memory& cpu_memory_, const Device& device_, | 78 | Tegra::MaxwellDeviceMemoryManager& device_memory_, const Device& device_, |
| 80 | ScreenInfo& screen_info_, ProgramManager& program_manager_, | 79 | ScreenInfo& screen_info_, ProgramManager& program_manager_, |
| 81 | StateTracker& state_tracker_); | 80 | StateTracker& state_tracker_); |
| 82 | ~RasterizerOpenGL() override; | 81 | ~RasterizerOpenGL() override; |
| @@ -92,17 +91,17 @@ public: | |||
| 92 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; | 91 | void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override; |
| 93 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; | 92 | void DisableGraphicsUniformBuffer(size_t stage, u32 index) override; |
| 94 | void FlushAll() override; | 93 | void FlushAll() override; |
| 95 | void FlushRegion(VAddr addr, u64 size, | 94 | void FlushRegion(DAddr addr, u64 size, |
| 96 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | 95 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; |
| 97 | bool MustFlushRegion(VAddr addr, u64 size, | 96 | bool MustFlushRegion(DAddr addr, u64 size, |
| 98 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | 97 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; |
| 99 | VideoCore::RasterizerDownloadArea GetFlushArea(VAddr addr, u64 size) override; | 98 | VideoCore::RasterizerDownloadArea GetFlushArea(PAddr addr, u64 size) override; |
| 100 | void InvalidateRegion(VAddr addr, u64 size, | 99 | void InvalidateRegion(DAddr addr, u64 size, |
| 101 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | 100 | VideoCommon::CacheType which = VideoCommon::CacheType::All) override; |
| 102 | void OnCacheInvalidation(VAddr addr, u64 size) override; | 101 | void OnCacheInvalidation(PAddr addr, u64 size) override; |
| 103 | bool OnCPUWrite(VAddr addr, u64 size) override; | 102 | bool OnCPUWrite(PAddr addr, u64 size) override; |
| 104 | void InvalidateGPUCache() override; | 103 | void InvalidateGPUCache() override; |
| 105 | void UnmapMemory(VAddr addr, u64 size) override; | 104 | void UnmapMemory(DAddr addr, u64 size) override; |
| 106 | void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; | 105 | void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override; |
| 107 | void SignalFence(std::function<void()>&& func) override; | 106 | void SignalFence(std::function<void()>&& func) override; |
| 108 | void SyncOperation(std::function<void()>&& func) override; | 107 | void SyncOperation(std::function<void()>&& func) override; |
| @@ -110,7 +109,7 @@ public: | |||
| 110 | void SignalReference() override; | 109 | void SignalReference() override; |
| 111 | void ReleaseFences(bool force = true) override; | 110 | void ReleaseFences(bool force = true) override; |
| 112 | void FlushAndInvalidateRegion( | 111 | void FlushAndInvalidateRegion( |
| 113 | VAddr addr, u64 size, VideoCommon::CacheType which = VideoCommon::CacheType::All) override; | 112 | DAddr addr, u64 size, VideoCommon::CacheType which = VideoCommon::CacheType::All) override; |
| 114 | void WaitForIdle() override; | 113 | void WaitForIdle() override; |
| 115 | void FragmentBarrier() override; | 114 | void FragmentBarrier() override; |
| 116 | void TiledCacheBarrier() override; | 115 | void TiledCacheBarrier() override; |
| @@ -123,7 +122,7 @@ public: | |||
| 123 | Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; | 122 | Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override; |
| 124 | void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, | 123 | void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size, |
| 125 | std::span<const u8> memory) override; | 124 | std::span<const u8> memory) override; |
| 126 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr, | 125 | bool AccelerateDisplay(const Tegra::FramebufferConfig& config, DAddr framebuffer_addr, |
| 127 | u32 pixel_stride) override; | 126 | u32 pixel_stride) override; |
| 128 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, | 127 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, |
| 129 | const VideoCore::DiskResourceLoadCallback& callback) override; | 128 | const VideoCore::DiskResourceLoadCallback& callback) override; |
| @@ -235,6 +234,7 @@ private: | |||
| 235 | VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport); | 234 | VideoCommon::QueryPropertiesFlags flags, u32 payload, u32 subreport); |
| 236 | 235 | ||
| 237 | Tegra::GPU& gpu; | 236 | Tegra::GPU& gpu; |
| 237 | Tegra::MaxwellDeviceMemoryManager& device_memory; | ||
| 238 | 238 | ||
| 239 | const Device& device; | 239 | const Device& device; |
| 240 | ScreenInfo& screen_info; | 240 | ScreenInfo& screen_info; |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.cpp b/src/video_core/renderer_opengl/gl_shader_cache.cpp index 30df41b7d..50462cdde 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_cache.cpp | |||
| @@ -168,11 +168,12 @@ void SetXfbState(VideoCommon::TransformFeedbackState& state, const Maxwell& regs | |||
| 168 | } | 168 | } |
| 169 | } // Anonymous namespace | 169 | } // Anonymous namespace |
| 170 | 170 | ||
| 171 | ShaderCache::ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindow& emu_window_, | 171 | ShaderCache::ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, |
| 172 | const Device& device_, TextureCache& texture_cache_, | 172 | Core::Frontend::EmuWindow& emu_window_, const Device& device_, |
| 173 | BufferCache& buffer_cache_, ProgramManager& program_manager_, | 173 | TextureCache& texture_cache_, BufferCache& buffer_cache_, |
| 174 | StateTracker& state_tracker_, VideoCore::ShaderNotify& shader_notify_) | 174 | ProgramManager& program_manager_, StateTracker& state_tracker_, |
| 175 | : VideoCommon::ShaderCache{rasterizer_}, emu_window{emu_window_}, device{device_}, | 175 | VideoCore::ShaderNotify& shader_notify_) |
| 176 | : VideoCommon::ShaderCache{device_memory_}, emu_window{emu_window_}, device{device_}, | ||
| 176 | texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, program_manager{program_manager_}, | 177 | texture_cache{texture_cache_}, buffer_cache{buffer_cache_}, program_manager{program_manager_}, |
| 177 | state_tracker{state_tracker_}, shader_notify{shader_notify_}, | 178 | state_tracker{state_tracker_}, shader_notify{shader_notify_}, |
| 178 | use_asynchronous_shaders{device.UseAsynchronousShaders()}, | 179 | use_asynchronous_shaders{device.UseAsynchronousShaders()}, |
diff --git a/src/video_core/renderer_opengl/gl_shader_cache.h b/src/video_core/renderer_opengl/gl_shader_cache.h index 6b9732fca..5ac413529 100644 --- a/src/video_core/renderer_opengl/gl_shader_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_cache.h | |||
| @@ -17,7 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | namespace Tegra { | 18 | namespace Tegra { |
| 19 | class MemoryManager; | 19 | class MemoryManager; |
| 20 | } | 20 | } // namespace Tegra |
| 21 | 21 | ||
| 22 | namespace OpenGL { | 22 | namespace OpenGL { |
| 23 | 23 | ||
| @@ -28,10 +28,11 @@ using ShaderWorker = Common::StatefulThreadWorker<ShaderContext::Context>; | |||
| 28 | 28 | ||
| 29 | class ShaderCache : public VideoCommon::ShaderCache { | 29 | class ShaderCache : public VideoCommon::ShaderCache { |
| 30 | public: | 30 | public: |
| 31 | explicit ShaderCache(RasterizerOpenGL& rasterizer_, Core::Frontend::EmuWindow& emu_window_, | 31 | explicit ShaderCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, |
| 32 | const Device& device_, TextureCache& texture_cache_, | 32 | Core::Frontend::EmuWindow& emu_window_, const Device& device_, |
| 33 | BufferCache& buffer_cache_, ProgramManager& program_manager_, | 33 | TextureCache& texture_cache_, BufferCache& buffer_cache_, |
| 34 | StateTracker& state_tracker_, VideoCore::ShaderNotify& shader_notify_); | 34 | ProgramManager& program_manager_, StateTracker& state_tracker_, |
| 35 | VideoCore::ShaderNotify& shader_notify_); | ||
| 35 | ~ShaderCache(); | 36 | ~ShaderCache(); |
| 36 | 37 | ||
| 37 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, | 38 | void LoadDiskResources(u64 title_id, std::stop_token stop_loading, |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 2933718b6..821a045ad 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp | |||
| @@ -144,12 +144,13 @@ void APIENTRY DebugHandler(GLenum source, GLenum type, GLuint id, GLenum severit | |||
| 144 | 144 | ||
| 145 | RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_, | 145 | RendererOpenGL::RendererOpenGL(Core::TelemetrySession& telemetry_session_, |
| 146 | Core::Frontend::EmuWindow& emu_window_, | 146 | Core::Frontend::EmuWindow& emu_window_, |
| 147 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, | 147 | Tegra::MaxwellDeviceMemoryManager& device_memory_, Tegra::GPU& gpu_, |
| 148 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) | 148 | std::unique_ptr<Core::Frontend::GraphicsContext> context_) |
| 149 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, | 149 | : RendererBase{emu_window_, std::move(context_)}, telemetry_session{telemetry_session_}, |
| 150 | emu_window{emu_window_}, cpu_memory{cpu_memory_}, gpu{gpu_}, device{emu_window_}, | 150 | emu_window{emu_window_}, device_memory{device_memory_}, gpu{gpu_}, device{emu_window_}, |
| 151 | state_tracker{}, program_manager{device}, | 151 | state_tracker{}, program_manager{device}, |
| 152 | rasterizer(emu_window, gpu, cpu_memory, device, screen_info, program_manager, state_tracker) { | 152 | rasterizer(emu_window, gpu, device_memory, device, screen_info, program_manager, |
| 153 | state_tracker) { | ||
| 153 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { | 154 | if (Settings::values.renderer_debug && GLAD_GL_KHR_debug) { |
| 154 | glEnable(GL_DEBUG_OUTPUT); | 155 | glEnable(GL_DEBUG_OUTPUT); |
| 155 | glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); | 156 | glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); |
| @@ -242,7 +243,7 @@ void RendererOpenGL::LoadFBToScreenInfo(const Tegra::FramebufferConfig& framebuf | |||
| 242 | const u32 bytes_per_pixel{VideoCore::Surface::BytesPerBlock(pixel_format)}; | 243 | const u32 bytes_per_pixel{VideoCore::Surface::BytesPerBlock(pixel_format)}; |
| 243 | const u64 size_in_bytes{Tegra::Texture::CalculateSize( | 244 | const u64 size_in_bytes{Tegra::Texture::CalculateSize( |
| 244 | true, bytes_per_pixel, framebuffer.stride, framebuffer.height, 1, block_height_log2, 0)}; | 245 | true, bytes_per_pixel, framebuffer.stride, framebuffer.height, 1, block_height_log2, 0)}; |
| 245 | const u8* const host_ptr{cpu_memory.GetPointer(framebuffer_addr)}; | 246 | const u8* const host_ptr{device_memory.GetPointer<u8>(framebuffer_addr)}; |
| 246 | const std::span<const u8> input_data(host_ptr, size_in_bytes); | 247 | const std::span<const u8> input_data(host_ptr, size_in_bytes); |
| 247 | Tegra::Texture::UnswizzleTexture(gl_framebuffer_data, input_data, bytes_per_pixel, | 248 | Tegra::Texture::UnswizzleTexture(gl_framebuffer_data, input_data, bytes_per_pixel, |
| 248 | framebuffer.width, framebuffer.height, 1, block_height_log2, | 249 | framebuffer.width, framebuffer.height, 1, block_height_log2, |
diff --git a/src/video_core/renderer_opengl/renderer_opengl.h b/src/video_core/renderer_opengl/renderer_opengl.h index b70607635..18699610a 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.h +++ b/src/video_core/renderer_opengl/renderer_opengl.h | |||
| @@ -61,7 +61,7 @@ class RendererOpenGL final : public VideoCore::RendererBase { | |||
| 61 | public: | 61 | public: |
| 62 | explicit RendererOpenGL(Core::TelemetrySession& telemetry_session_, | 62 | explicit RendererOpenGL(Core::TelemetrySession& telemetry_session_, |
| 63 | Core::Frontend::EmuWindow& emu_window_, | 63 | Core::Frontend::EmuWindow& emu_window_, |
| 64 | Core::Memory::Memory& cpu_memory_, Tegra::GPU& gpu_, | 64 | Tegra::MaxwellDeviceMemoryManager& device_memory_, Tegra::GPU& gpu_, |
| 65 | std::unique_ptr<Core::Frontend::GraphicsContext> context_); | 65 | std::unique_ptr<Core::Frontend::GraphicsContext> context_); |
| 66 | ~RendererOpenGL() override; | 66 | ~RendererOpenGL() override; |
| 67 | 67 | ||
| @@ -101,7 +101,7 @@ private: | |||
| 101 | 101 | ||
| 102 | Core::TelemetrySession& telemetry_session; | 102 | Core::TelemetrySession& telemetry_session; |
| 103 | Core::Frontend::EmuWindow& emu_window; | 103 | Core::Frontend::EmuWindow& emu_window; |
| 104 | Core::Memory::Memory& cpu_memory; | 104 | Tegra::MaxwellDeviceMemoryManager& device_memory; |
| 105 | Tegra::GPU& gpu; | 105 | Tegra::GPU& gpu; |
| 106 | 106 | ||
| 107 | Device device; | 107 | Device device; |