diff options
| author | 2019-11-26 14:10:49 -0500 | |
|---|---|---|
| committer | 2019-11-26 21:55:37 -0500 | |
| commit | 536fc7f0ea77e08d68c760f387c307d258804e3b (patch) | |
| tree | e979df531bf1222788cc26144531c6e6f5cca1d1 /src | |
| parent | core/memory: Move memory read/write implementation functions into an anonymou... (diff) | |
| download | yuzu-536fc7f0ea77e08d68c760f387c307d258804e3b.tar.gz yuzu-536fc7f0ea77e08d68c760f387c307d258804e3b.tar.xz yuzu-536fc7f0ea77e08d68c760f387c307d258804e3b.zip | |
core: Prepare various classes for memory read/write migration
Amends a few interfaces to be able to handle the migration over to the
new Memory class by passing the class by reference as a function
parameter where necessary.
Notably, within the filesystem services, this eliminates two ReadBlock()
calls by using the helper functions of HLERequestContext to do that for
us.
Diffstat (limited to 'src')
24 files changed, 108 insertions, 61 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp index 6b0167acd..12e2b7901 100644 --- a/src/audio_core/audio_renderer.cpp +++ b/src/audio_core/audio_renderer.cpp | |||
| @@ -36,9 +36,9 @@ public: | |||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | void SetWaveIndex(std::size_t index); | 38 | void SetWaveIndex(std::size_t index); |
| 39 | std::vector<s16> DequeueSamples(std::size_t sample_count); | 39 | std::vector<s16> DequeueSamples(std::size_t sample_count, Memory::Memory& memory); |
| 40 | void UpdateState(); | 40 | void UpdateState(); |
| 41 | void RefreshBuffer(); | 41 | void RefreshBuffer(Memory::Memory& memory); |
| 42 | 42 | ||
| 43 | private: | 43 | private: |
| 44 | bool is_in_use{}; | 44 | bool is_in_use{}; |
| @@ -66,17 +66,18 @@ public: | |||
| 66 | return info; | 66 | return info; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | void UpdateState(); | 69 | void UpdateState(Memory::Memory& memory); |
| 70 | 70 | ||
| 71 | private: | 71 | private: |
| 72 | EffectOutStatus out_status{}; | 72 | EffectOutStatus out_status{}; |
| 73 | EffectInStatus info{}; | 73 | EffectInStatus info{}; |
| 74 | }; | 74 | }; |
| 75 | AudioRenderer::AudioRenderer(Core::Timing::CoreTiming& core_timing, AudioRendererParameter params, | 75 | AudioRenderer::AudioRenderer(Core::Timing::CoreTiming& core_timing, Memory::Memory& memory_, |
| 76 | AudioRendererParameter params, | ||
| 76 | std::shared_ptr<Kernel::WritableEvent> buffer_event, | 77 | std::shared_ptr<Kernel::WritableEvent> buffer_event, |
| 77 | std::size_t instance_number) | 78 | std::size_t instance_number) |
| 78 | : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count), | 79 | : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count), |
| 79 | effects(params.effect_count) { | 80 | effects(params.effect_count), memory{memory_} { |
| 80 | 81 | ||
| 81 | audio_out = std::make_unique<AudioCore::AudioOut>(); | 82 | audio_out = std::make_unique<AudioCore::AudioOut>(); |
| 82 | stream = audio_out->OpenStream(core_timing, STREAM_SAMPLE_RATE, STREAM_NUM_CHANNELS, | 83 | stream = audio_out->OpenStream(core_timing, STREAM_SAMPLE_RATE, STREAM_NUM_CHANNELS, |
| @@ -162,7 +163,7 @@ std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_ | |||
| 162 | } | 163 | } |
| 163 | 164 | ||
| 164 | for (auto& effect : effects) { | 165 | for (auto& effect : effects) { |
| 165 | effect.UpdateState(); | 166 | effect.UpdateState(memory); |
| 166 | } | 167 | } |
| 167 | 168 | ||
| 168 | // Release previous buffers and queue next ones for playback | 169 | // Release previous buffers and queue next ones for playback |
| @@ -206,13 +207,14 @@ void AudioRenderer::VoiceState::SetWaveIndex(std::size_t index) { | |||
| 206 | is_refresh_pending = true; | 207 | is_refresh_pending = true; |
| 207 | } | 208 | } |
| 208 | 209 | ||
| 209 | std::vector<s16> AudioRenderer::VoiceState::DequeueSamples(std::size_t sample_count) { | 210 | std::vector<s16> AudioRenderer::VoiceState::DequeueSamples(std::size_t sample_count, |
| 211 | Memory::Memory& memory) { | ||
| 210 | if (!IsPlaying()) { | 212 | if (!IsPlaying()) { |
| 211 | return {}; | 213 | return {}; |
| 212 | } | 214 | } |
| 213 | 215 | ||
| 214 | if (is_refresh_pending) { | 216 | if (is_refresh_pending) { |
| 215 | RefreshBuffer(); | 217 | RefreshBuffer(memory); |
| 216 | } | 218 | } |
| 217 | 219 | ||
| 218 | const std::size_t max_size{samples.size() - offset}; | 220 | const std::size_t max_size{samples.size() - offset}; |
| @@ -256,7 +258,7 @@ void AudioRenderer::VoiceState::UpdateState() { | |||
| 256 | is_in_use = info.is_in_use; | 258 | is_in_use = info.is_in_use; |
| 257 | } | 259 | } |
| 258 | 260 | ||
| 259 | void AudioRenderer::VoiceState::RefreshBuffer() { | 261 | void AudioRenderer::VoiceState::RefreshBuffer(Memory::Memory& memory) { |
| 260 | std::vector<s16> new_samples(info.wave_buffer[wave_index].buffer_sz / sizeof(s16)); | 262 | std::vector<s16> new_samples(info.wave_buffer[wave_index].buffer_sz / sizeof(s16)); |
| 261 | Memory::ReadBlock(info.wave_buffer[wave_index].buffer_addr, new_samples.data(), | 263 | Memory::ReadBlock(info.wave_buffer[wave_index].buffer_addr, new_samples.data(), |
| 262 | info.wave_buffer[wave_index].buffer_sz); | 264 | info.wave_buffer[wave_index].buffer_sz); |
| @@ -307,7 +309,7 @@ void AudioRenderer::VoiceState::RefreshBuffer() { | |||
| 307 | is_refresh_pending = false; | 309 | is_refresh_pending = false; |
| 308 | } | 310 | } |
| 309 | 311 | ||
| 310 | void AudioRenderer::EffectState::UpdateState() { | 312 | void AudioRenderer::EffectState::UpdateState(Memory::Memory& memory) { |
| 311 | if (info.is_new) { | 313 | if (info.is_new) { |
| 312 | out_status.state = EffectStatus::New; | 314 | out_status.state = EffectStatus::New; |
| 313 | } else { | 315 | } else { |
| @@ -340,7 +342,7 @@ void AudioRenderer::QueueMixedBuffer(Buffer::Tag tag) { | |||
| 340 | std::size_t offset{}; | 342 | std::size_t offset{}; |
| 341 | s64 samples_remaining{BUFFER_SIZE}; | 343 | s64 samples_remaining{BUFFER_SIZE}; |
| 342 | while (samples_remaining > 0) { | 344 | while (samples_remaining > 0) { |
| 343 | const std::vector<s16> samples{voice.DequeueSamples(samples_remaining)}; | 345 | const std::vector<s16> samples{voice.DequeueSamples(samples_remaining, memory)}; |
| 344 | 346 | ||
| 345 | if (samples.empty()) { | 347 | if (samples.empty()) { |
| 346 | break; | 348 | break; |
diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index abed224bb..be1b019f1 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h | |||
| @@ -22,6 +22,10 @@ namespace Kernel { | |||
| 22 | class WritableEvent; | 22 | class WritableEvent; |
| 23 | } | 23 | } |
| 24 | 24 | ||
| 25 | namespace Memory { | ||
| 26 | class Memory; | ||
| 27 | } | ||
| 28 | |||
| 25 | namespace AudioCore { | 29 | namespace AudioCore { |
| 26 | 30 | ||
| 27 | class AudioOut; | 31 | class AudioOut; |
| @@ -217,7 +221,8 @@ static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has wrong size | |||
| 217 | 221 | ||
| 218 | class AudioRenderer { | 222 | class AudioRenderer { |
| 219 | public: | 223 | public: |
| 220 | AudioRenderer(Core::Timing::CoreTiming& core_timing, AudioRendererParameter params, | 224 | AudioRenderer(Core::Timing::CoreTiming& core_timing, Memory::Memory& memory_, |
| 225 | AudioRendererParameter params, | ||
| 221 | std::shared_ptr<Kernel::WritableEvent> buffer_event, std::size_t instance_number); | 226 | std::shared_ptr<Kernel::WritableEvent> buffer_event, std::size_t instance_number); |
| 222 | ~AudioRenderer(); | 227 | ~AudioRenderer(); |
| 223 | 228 | ||
| @@ -238,7 +243,8 @@ private: | |||
| 238 | std::vector<VoiceState> voices; | 243 | std::vector<VoiceState> voices; |
| 239 | std::vector<EffectState> effects; | 244 | std::vector<EffectState> effects; |
| 240 | std::unique_ptr<AudioOut> audio_out; | 245 | std::unique_ptr<AudioOut> audio_out; |
| 241 | AudioCore::StreamPtr stream; | 246 | StreamPtr stream; |
| 247 | Memory::Memory& memory; | ||
| 242 | }; | 248 | }; |
| 243 | 249 | ||
| 244 | } // namespace AudioCore | 250 | } // namespace AudioCore |
diff --git a/src/core/arm/arm_interface.cpp b/src/core/arm/arm_interface.cpp index 372612c9b..dea192869 100644 --- a/src/core/arm/arm_interface.cpp +++ b/src/core/arm/arm_interface.cpp | |||
| @@ -13,7 +13,6 @@ | |||
| 13 | #include "core/memory.h" | 13 | #include "core/memory.h" |
| 14 | 14 | ||
| 15 | namespace Core { | 15 | namespace Core { |
| 16 | |||
| 17 | namespace { | 16 | namespace { |
| 18 | 17 | ||
| 19 | constexpr u64 ELF_DYNAMIC_TAG_NULL = 0; | 18 | constexpr u64 ELF_DYNAMIC_TAG_NULL = 0; |
| @@ -156,7 +155,7 @@ std::vector<ARM_Interface::BacktraceEntry> ARM_Interface::GetBacktrace() const { | |||
| 156 | } | 155 | } |
| 157 | 156 | ||
| 158 | std::map<VAddr, std::string> modules; | 157 | std::map<VAddr, std::string> modules; |
| 159 | auto& loader{System::GetInstance().GetAppLoader()}; | 158 | auto& loader{system.GetAppLoader()}; |
| 160 | if (loader.ReadNSOModules(modules) != Loader::ResultStatus::Success) { | 159 | if (loader.ReadNSOModules(modules) != Loader::ResultStatus::Success) { |
| 161 | return {}; | 160 | return {}; |
| 162 | } | 161 | } |
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 45e94e625..47b964eb7 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -17,11 +17,13 @@ enum class VMAPermission : u8; | |||
| 17 | } | 17 | } |
| 18 | 18 | ||
| 19 | namespace Core { | 19 | namespace Core { |
| 20 | class System; | ||
| 20 | 21 | ||
| 21 | /// Generic ARMv8 CPU interface | 22 | /// Generic ARMv8 CPU interface |
| 22 | class ARM_Interface : NonCopyable { | 23 | class ARM_Interface : NonCopyable { |
| 23 | public: | 24 | public: |
| 24 | virtual ~ARM_Interface() {} | 25 | explicit ARM_Interface(System& system_) : system{system_} {} |
| 26 | virtual ~ARM_Interface() = default; | ||
| 25 | 27 | ||
| 26 | struct ThreadContext { | 28 | struct ThreadContext { |
| 27 | std::array<u64, 31> cpu_registers; | 29 | std::array<u64, 31> cpu_registers; |
| @@ -163,6 +165,10 @@ public: | |||
| 163 | /// fp+0 : pointer to previous frame record | 165 | /// fp+0 : pointer to previous frame record |
| 164 | /// fp+8 : value of lr for frame | 166 | /// fp+8 : value of lr for frame |
| 165 | void LogBacktrace() const; | 167 | void LogBacktrace() const; |
| 168 | |||
| 169 | protected: | ||
| 170 | /// System context that this ARM interface is running under. | ||
| 171 | System& system; | ||
| 166 | }; | 172 | }; |
| 167 | 173 | ||
| 168 | } // namespace Core | 174 | } // namespace Core |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index a0705b2b8..2b396f1d6 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -28,6 +28,7 @@ public: | |||
| 28 | explicit ARM_Dynarmic_Callbacks(ARM_Dynarmic& parent) : parent(parent) {} | 28 | explicit ARM_Dynarmic_Callbacks(ARM_Dynarmic& parent) : parent(parent) {} |
| 29 | 29 | ||
| 30 | u8 MemoryRead8(u64 vaddr) override { | 30 | u8 MemoryRead8(u64 vaddr) override { |
| 31 | auto& s = parent.system; | ||
| 31 | return Memory::Read8(vaddr); | 32 | return Memory::Read8(vaddr); |
| 32 | } | 33 | } |
| 33 | u16 MemoryRead16(u64 vaddr) override { | 34 | u16 MemoryRead16(u64 vaddr) override { |
| @@ -171,9 +172,10 @@ void ARM_Dynarmic::Step() { | |||
| 171 | 172 | ||
| 172 | ARM_Dynarmic::ARM_Dynarmic(System& system, ExclusiveMonitor& exclusive_monitor, | 173 | ARM_Dynarmic::ARM_Dynarmic(System& system, ExclusiveMonitor& exclusive_monitor, |
| 173 | std::size_t core_index) | 174 | std::size_t core_index) |
| 174 | : cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), inner_unicorn{system}, | 175 | : ARM_Interface{system}, |
| 175 | core_index{core_index}, system{system}, | 176 | cb(std::make_unique<ARM_Dynarmic_Callbacks>(*this)), inner_unicorn{system}, |
| 176 | exclusive_monitor{dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} {} | 177 | core_index{core_index}, exclusive_monitor{ |
| 178 | dynamic_cast<DynarmicExclusiveMonitor&>(exclusive_monitor)} {} | ||
| 177 | 179 | ||
| 178 | ARM_Dynarmic::~ARM_Dynarmic() = default; | 180 | ARM_Dynarmic::~ARM_Dynarmic() = default; |
| 179 | 181 | ||
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 504d46c68..d08de475f 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -58,7 +58,6 @@ private: | |||
| 58 | ARM_Unicorn inner_unicorn; | 58 | ARM_Unicorn inner_unicorn; |
| 59 | 59 | ||
| 60 | std::size_t core_index; | 60 | std::size_t core_index; |
| 61 | System& system; | ||
| 62 | DynarmicExclusiveMonitor& exclusive_monitor; | 61 | DynarmicExclusiveMonitor& exclusive_monitor; |
| 63 | }; | 62 | }; |
| 64 | 63 | ||
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index 9698172db..48182c99a 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp | |||
| @@ -60,7 +60,7 @@ static bool UnmappedMemoryHook(uc_engine* uc, uc_mem_type type, u64 addr, int si | |||
| 60 | return false; | 60 | return false; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | ARM_Unicorn::ARM_Unicorn(System& system) : system{system} { | 63 | ARM_Unicorn::ARM_Unicorn(System& system) : ARM_Interface{system} { |
| 64 | CHECKED(uc_open(UC_ARCH_ARM64, UC_MODE_ARM, &uc)); | 64 | CHECKED(uc_open(UC_ARCH_ARM64, UC_MODE_ARM, &uc)); |
| 65 | 65 | ||
| 66 | auto fpv = 3 << 20; | 66 | auto fpv = 3 << 20; |
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h index b39426ea0..3c5b155f9 100644 --- a/src/core/arm/unicorn/arm_unicorn.h +++ b/src/core/arm/unicorn/arm_unicorn.h | |||
| @@ -45,7 +45,6 @@ private: | |||
| 45 | static void InterruptHook(uc_engine* uc, u32 int_no, void* user_data); | 45 | static void InterruptHook(uc_engine* uc, u32 int_no, void* user_data); |
| 46 | 46 | ||
| 47 | uc_engine* uc{}; | 47 | uc_engine* uc{}; |
| 48 | System& system; | ||
| 49 | GDBStub::BreakpointAddress last_bkpt{}; | 48 | GDBStub::BreakpointAddress last_bkpt{}; |
| 50 | bool last_bkpt_hit = false; | 49 | bool last_bkpt_hit = false; |
| 51 | }; | 50 | }; |
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 5995a6556..9849dbe91 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp | |||
| @@ -21,10 +21,10 @@ ClientSession::~ClientSession() { | |||
| 21 | } | 21 | } |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | ResultCode ClientSession::SendSyncRequest(Thread* thread) { | 24 | ResultCode ClientSession::SendSyncRequest(Thread* thread, Memory::Memory& memory) { |
| 25 | // Signal the server session that new data is available | 25 | // Signal the server session that new data is available |
| 26 | if (auto server = parent->server.lock()) { | 26 | if (auto server = parent->server.lock()) { |
| 27 | return server->HandleSyncRequest(SharedFrom(thread)); | 27 | return server->HandleSyncRequest(SharedFrom(thread), memory); |
| 28 | } | 28 | } |
| 29 | 29 | ||
| 30 | return ERR_SESSION_CLOSED_BY_REMOTE; | 30 | return ERR_SESSION_CLOSED_BY_REMOTE; |
diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index 5ae41db29..484dd7bc9 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h | |||
| @@ -10,6 +10,10 @@ | |||
| 10 | 10 | ||
| 11 | union ResultCode; | 11 | union ResultCode; |
| 12 | 12 | ||
| 13 | namespace Memory { | ||
| 14 | class Memory; | ||
| 15 | } | ||
| 16 | |||
| 13 | namespace Kernel { | 17 | namespace Kernel { |
| 14 | 18 | ||
| 15 | class KernelCore; | 19 | class KernelCore; |
| @@ -37,7 +41,7 @@ public: | |||
| 37 | return HANDLE_TYPE; | 41 | return HANDLE_TYPE; |
| 38 | } | 42 | } |
| 39 | 43 | ||
| 40 | ResultCode SendSyncRequest(Thread* thread); | 44 | ResultCode SendSyncRequest(Thread* thread, Memory::Memory& memory); |
| 41 | 45 | ||
| 42 | private: | 46 | private: |
| 43 | /// The parent session, which links to the server endpoint. | 47 | /// The parent session, which links to the server endpoint. |
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index c7db21eb2..57878514d 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp | |||
| @@ -127,7 +127,8 @@ ResultCode ServerSession::HandleDomainSyncRequest(Kernel::HLERequestContext& con | |||
| 127 | return RESULT_SUCCESS; | 127 | return RESULT_SUCCESS; |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread) { | 130 | ResultCode ServerSession::HandleSyncRequest(std::shared_ptr<Thread> thread, |
| 131 | Memory::Memory& memory) { | ||
| 131 | // The ServerSession received a sync request, this means that there's new data available | 132 | // The ServerSession received a sync request, this means that there's new data available |
| 132 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or | 133 | // from its ClientSession, so wake up any threads that may be waiting on a svcReplyAndReceive or |
| 133 | // similar. | 134 | // similar. |
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h index 8a65647b6..641709a45 100644 --- a/src/core/hle/kernel/server_session.h +++ b/src/core/hle/kernel/server_session.h | |||
| @@ -13,6 +13,10 @@ | |||
| 13 | #include "core/hle/kernel/wait_object.h" | 13 | #include "core/hle/kernel/wait_object.h" |
| 14 | #include "core/hle/result.h" | 14 | #include "core/hle/result.h" |
| 15 | 15 | ||
| 16 | namespace Memory { | ||
| 17 | class Memory; | ||
| 18 | } | ||
| 19 | |||
| 16 | namespace Kernel { | 20 | namespace Kernel { |
| 17 | 21 | ||
| 18 | class ClientPort; | 22 | class ClientPort; |
| @@ -85,10 +89,13 @@ public: | |||
| 85 | 89 | ||
| 86 | /** | 90 | /** |
| 87 | * Handle a sync request from the emulated application. | 91 | * Handle a sync request from the emulated application. |
| 92 | * | ||
| 88 | * @param thread Thread that initiated the request. | 93 | * @param thread Thread that initiated the request. |
| 94 | * @param memory Memory context to handle the sync request under. | ||
| 95 | * | ||
| 89 | * @returns ResultCode from the operation. | 96 | * @returns ResultCode from the operation. |
| 90 | */ | 97 | */ |
| 91 | ResultCode HandleSyncRequest(std::shared_ptr<Thread> thread); | 98 | ResultCode HandleSyncRequest(std::shared_ptr<Thread> thread, Memory::Memory& memory); |
| 92 | 99 | ||
| 93 | bool ShouldWait(const Thread* thread) const override; | 100 | bool ShouldWait(const Thread* thread) const override; |
| 94 | 101 | ||
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index eddafaf60..68bff11ec 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -383,7 +383,7 @@ static ResultCode SendSyncRequest(Core::System& system, Handle handle) { | |||
| 383 | 383 | ||
| 384 | // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server | 384 | // TODO(Subv): svcSendSyncRequest should put the caller thread to sleep while the server |
| 385 | // responds and cause a reschedule. | 385 | // responds and cause a reschedule. |
| 386 | return session->SendSyncRequest(system.CurrentScheduler().GetCurrentThread()); | 386 | return session->SendSyncRequest(system.CurrentScheduler().GetCurrentThread(), system.Memory()); |
| 387 | } | 387 | } |
| 388 | 388 | ||
| 389 | /// Get the ID for the specified thread. | 389 | /// Get the ID for the specified thread. |
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 4ea7ade6e..82a5dbf14 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -49,8 +49,9 @@ public: | |||
| 49 | 49 | ||
| 50 | system_event = | 50 | system_event = |
| 51 | Kernel::WritableEvent::CreateEventPair(system.Kernel(), "IAudioRenderer:SystemEvent"); | 51 | Kernel::WritableEvent::CreateEventPair(system.Kernel(), "IAudioRenderer:SystemEvent"); |
| 52 | renderer = std::make_unique<AudioCore::AudioRenderer>( | 52 | renderer = std::make_unique<AudioCore::AudioRenderer>(system.CoreTiming(), system.Memory(), |
| 53 | system.CoreTiming(), audren_params, system_event.writable, instance_number); | 53 | audren_params, system_event.writable, |
| 54 | instance_number); | ||
| 54 | } | 55 | } |
| 55 | 56 | ||
| 56 | private: | 57 | private: |
diff --git a/src/core/hle/service/filesystem/fsp_srv.cpp b/src/core/hle/service/filesystem/fsp_srv.cpp index 5874ed6bd..89e1957f9 100644 --- a/src/core/hle/service/filesystem/fsp_srv.cpp +++ b/src/core/hle/service/filesystem/fsp_srv.cpp | |||
| @@ -391,13 +391,10 @@ public: | |||
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | void RenameFile(Kernel::HLERequestContext& ctx) { | 393 | void RenameFile(Kernel::HLERequestContext& ctx) { |
| 394 | std::vector<u8> buffer; | 394 | std::vector<u8> buffer = ctx.ReadBuffer(0); |
| 395 | buffer.resize(ctx.BufferDescriptorX()[0].Size()); | ||
| 396 | Memory::ReadBlock(ctx.BufferDescriptorX()[0].Address(), buffer.data(), buffer.size()); | ||
| 397 | const std::string src_name = Common::StringFromBuffer(buffer); | 395 | const std::string src_name = Common::StringFromBuffer(buffer); |
| 398 | 396 | ||
| 399 | buffer.resize(ctx.BufferDescriptorX()[1].Size()); | 397 | buffer = ctx.ReadBuffer(1); |
| 400 | Memory::ReadBlock(ctx.BufferDescriptorX()[1].Address(), buffer.data(), buffer.size()); | ||
| 401 | const std::string dst_name = Common::StringFromBuffer(buffer); | 398 | const std::string dst_name = Common::StringFromBuffer(buffer); |
| 402 | 399 | ||
| 403 | LOG_DEBUG(Service_FS, "called. file '{}' to file '{}'", src_name, dst_name); | 400 | LOG_DEBUG(Service_FS, "called. file '{}' to file '{}'", src_name, dst_name); |
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index 435f2d286..74ecaef1b 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp | |||
| @@ -17,7 +17,8 @@ namespace Service::LM { | |||
| 17 | 17 | ||
| 18 | class ILogger final : public ServiceFramework<ILogger> { | 18 | class ILogger final : public ServiceFramework<ILogger> { |
| 19 | public: | 19 | public: |
| 20 | ILogger(Manager& manager) : ServiceFramework("ILogger"), manager(manager) { | 20 | explicit ILogger(Manager& manager_, Memory::Memory& memory_) |
| 21 | : ServiceFramework("ILogger"), manager{manager_}, memory{memory_} { | ||
| 21 | static const FunctionInfo functions[] = { | 22 | static const FunctionInfo functions[] = { |
| 22 | {0, &ILogger::Log, "Log"}, | 23 | {0, &ILogger::Log, "Log"}, |
| 23 | {1, &ILogger::SetDestination, "SetDestination"}, | 24 | {1, &ILogger::SetDestination, "SetDestination"}, |
| @@ -74,11 +75,13 @@ private: | |||
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | Manager& manager; | 77 | Manager& manager; |
| 78 | Memory::Memory& memory; | ||
| 77 | }; | 79 | }; |
| 78 | 80 | ||
| 79 | class LM final : public ServiceFramework<LM> { | 81 | class LM final : public ServiceFramework<LM> { |
| 80 | public: | 82 | public: |
| 81 | explicit LM(Manager& manager) : ServiceFramework{"lm"}, manager(manager) { | 83 | explicit LM(Manager& manager_, Memory::Memory& memory_) |
| 84 | : ServiceFramework{"lm"}, manager{manager_}, memory{memory_} { | ||
| 82 | // clang-format off | 85 | // clang-format off |
| 83 | static const FunctionInfo functions[] = { | 86 | static const FunctionInfo functions[] = { |
| 84 | {0, &LM::OpenLogger, "OpenLogger"}, | 87 | {0, &LM::OpenLogger, "OpenLogger"}, |
| @@ -94,14 +97,16 @@ private: | |||
| 94 | 97 | ||
| 95 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 98 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 96 | rb.Push(RESULT_SUCCESS); | 99 | rb.Push(RESULT_SUCCESS); |
| 97 | rb.PushIpcInterface<ILogger>(manager); | 100 | rb.PushIpcInterface<ILogger>(manager, memory); |
| 98 | } | 101 | } |
| 99 | 102 | ||
| 100 | Manager& manager; | 103 | Manager& manager; |
| 104 | Memory::Memory& memory; | ||
| 101 | }; | 105 | }; |
| 102 | 106 | ||
| 103 | void InstallInterfaces(Core::System& system) { | 107 | void InstallInterfaces(Core::System& system) { |
| 104 | std::make_shared<LM>(system.GetLogManager())->InstallAsService(system.ServiceManager()); | 108 | std::make_shared<LM>(system.GetLogManager(), system.Memory()) |
| 109 | ->InstallAsService(system.ServiceManager()); | ||
| 105 | } | 110 | } |
| 106 | 111 | ||
| 107 | } // namespace Service::LM | 112 | } // namespace Service::LM |
diff --git a/src/core/reporter.cpp b/src/core/reporter.cpp index 6f4af77fd..af0988d62 100644 --- a/src/core/reporter.cpp +++ b/src/core/reporter.cpp | |||
| @@ -147,7 +147,7 @@ json GetFullDataAuto(const std::string& timestamp, u64 title_id, Core::System& s | |||
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | template <bool read_value, typename DescriptorType> | 149 | template <bool read_value, typename DescriptorType> |
| 150 | json GetHLEBufferDescriptorData(const std::vector<DescriptorType>& buffer) { | 150 | json GetHLEBufferDescriptorData(const std::vector<DescriptorType>& buffer, Memory::Memory& memory) { |
| 151 | auto buffer_out = json::array(); | 151 | auto buffer_out = json::array(); |
| 152 | for (const auto& desc : buffer) { | 152 | for (const auto& desc : buffer) { |
| 153 | auto entry = json{ | 153 | auto entry = json{ |
| @@ -167,7 +167,7 @@ json GetHLEBufferDescriptorData(const std::vector<DescriptorType>& buffer) { | |||
| 167 | return buffer_out; | 167 | return buffer_out; |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | json GetHLERequestContextData(Kernel::HLERequestContext& ctx) { | 170 | json GetHLERequestContextData(Kernel::HLERequestContext& ctx, Memory::Memory& memory) { |
| 171 | json out; | 171 | json out; |
| 172 | 172 | ||
| 173 | auto cmd_buf = json::array(); | 173 | auto cmd_buf = json::array(); |
| @@ -177,10 +177,10 @@ json GetHLERequestContextData(Kernel::HLERequestContext& ctx) { | |||
| 177 | 177 | ||
| 178 | out["command_buffer"] = std::move(cmd_buf); | 178 | out["command_buffer"] = std::move(cmd_buf); |
| 179 | 179 | ||
| 180 | out["buffer_descriptor_a"] = GetHLEBufferDescriptorData<true>(ctx.BufferDescriptorA()); | 180 | out["buffer_descriptor_a"] = GetHLEBufferDescriptorData<true>(ctx.BufferDescriptorA(), memory); |
| 181 | out["buffer_descriptor_b"] = GetHLEBufferDescriptorData<false>(ctx.BufferDescriptorB()); | 181 | out["buffer_descriptor_b"] = GetHLEBufferDescriptorData<false>(ctx.BufferDescriptorB(), memory); |
| 182 | out["buffer_descriptor_c"] = GetHLEBufferDescriptorData<false>(ctx.BufferDescriptorC()); | 182 | out["buffer_descriptor_c"] = GetHLEBufferDescriptorData<false>(ctx.BufferDescriptorC(), memory); |
| 183 | out["buffer_descriptor_x"] = GetHLEBufferDescriptorData<true>(ctx.BufferDescriptorX()); | 183 | out["buffer_descriptor_x"] = GetHLEBufferDescriptorData<true>(ctx.BufferDescriptorX(), memory); |
| 184 | 184 | ||
| 185 | return out; | 185 | return out; |
| 186 | } | 186 | } |
| @@ -259,7 +259,7 @@ void Reporter::SaveUnimplementedFunctionReport(Kernel::HLERequestContext& ctx, u | |||
| 259 | const auto title_id = system.CurrentProcess()->GetTitleID(); | 259 | const auto title_id = system.CurrentProcess()->GetTitleID(); |
| 260 | auto out = GetFullDataAuto(timestamp, title_id, system); | 260 | auto out = GetFullDataAuto(timestamp, title_id, system); |
| 261 | 261 | ||
| 262 | auto function_out = GetHLERequestContextData(ctx); | 262 | auto function_out = GetHLERequestContextData(ctx, system.Memory()); |
| 263 | function_out["command_id"] = command_id; | 263 | function_out["command_id"] = command_id; |
| 264 | function_out["function_name"] = name; | 264 | function_out["function_name"] = name; |
| 265 | function_out["service_name"] = service_name; | 265 | function_out["service_name"] = service_name; |
diff --git a/src/core/tools/freezer.cpp b/src/core/tools/freezer.cpp index 19b531ecb..c7f42388f 100644 --- a/src/core/tools/freezer.cpp +++ b/src/core/tools/freezer.cpp | |||
| @@ -11,12 +11,11 @@ | |||
| 11 | #include "core/tools/freezer.h" | 11 | #include "core/tools/freezer.h" |
| 12 | 12 | ||
| 13 | namespace Tools { | 13 | namespace Tools { |
| 14 | |||
| 15 | namespace { | 14 | namespace { |
| 16 | 15 | ||
| 17 | constexpr s64 MEMORY_FREEZER_TICKS = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); | 16 | constexpr s64 MEMORY_FREEZER_TICKS = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); |
| 18 | 17 | ||
| 19 | u64 MemoryReadWidth(u32 width, VAddr addr) { | 18 | u64 MemoryReadWidth(Memory::Memory& memory, u32 width, VAddr addr) { |
| 20 | switch (width) { | 19 | switch (width) { |
| 21 | case 1: | 20 | case 1: |
| 22 | return Memory::Read8(addr); | 21 | return Memory::Read8(addr); |
| @@ -32,7 +31,7 @@ u64 MemoryReadWidth(u32 width, VAddr addr) { | |||
| 32 | } | 31 | } |
| 33 | } | 32 | } |
| 34 | 33 | ||
| 35 | void MemoryWriteWidth(u32 width, VAddr addr, u64 value) { | 34 | void MemoryWriteWidth(Memory::Memory& memory, u32 width, VAddr addr, u64 value) { |
| 36 | switch (width) { | 35 | switch (width) { |
| 37 | case 1: | 36 | case 1: |
| 38 | Memory::Write8(addr, static_cast<u8>(value)); | 37 | Memory::Write8(addr, static_cast<u8>(value)); |
| @@ -53,7 +52,8 @@ void MemoryWriteWidth(u32 width, VAddr addr, u64 value) { | |||
| 53 | 52 | ||
| 54 | } // Anonymous namespace | 53 | } // Anonymous namespace |
| 55 | 54 | ||
| 56 | Freezer::Freezer(Core::Timing::CoreTiming& core_timing) : core_timing(core_timing) { | 55 | Freezer::Freezer(Core::Timing::CoreTiming& core_timing_, Memory::Memory& memory_) |
| 56 | : core_timing{core_timing_}, memory{memory_} { | ||
| 57 | event = Core::Timing::CreateEvent( | 57 | event = Core::Timing::CreateEvent( |
| 58 | "MemoryFreezer::FrameCallback", | 58 | "MemoryFreezer::FrameCallback", |
| 59 | [this](u64 userdata, s64 cycles_late) { FrameCallback(userdata, cycles_late); }); | 59 | [this](u64 userdata, s64 cycles_late) { FrameCallback(userdata, cycles_late); }); |
| @@ -89,7 +89,7 @@ void Freezer::Clear() { | |||
| 89 | u64 Freezer::Freeze(VAddr address, u32 width) { | 89 | u64 Freezer::Freeze(VAddr address, u32 width) { |
| 90 | std::lock_guard lock{entries_mutex}; | 90 | std::lock_guard lock{entries_mutex}; |
| 91 | 91 | ||
| 92 | const auto current_value = MemoryReadWidth(width, address); | 92 | const auto current_value = MemoryReadWidth(memory, width, address); |
| 93 | entries.push_back({address, width, current_value}); | 93 | entries.push_back({address, width, current_value}); |
| 94 | 94 | ||
| 95 | LOG_DEBUG(Common_Memory, | 95 | LOG_DEBUG(Common_Memory, |
| @@ -169,7 +169,7 @@ void Freezer::FrameCallback(u64 userdata, s64 cycles_late) { | |||
| 169 | LOG_DEBUG(Common_Memory, | 169 | LOG_DEBUG(Common_Memory, |
| 170 | "Enforcing memory freeze at address={:016X}, value={:016X}, width={:02X}", | 170 | "Enforcing memory freeze at address={:016X}, value={:016X}, width={:02X}", |
| 171 | entry.address, entry.value, entry.width); | 171 | entry.address, entry.value, entry.width); |
| 172 | MemoryWriteWidth(entry.width, entry.address, entry.value); | 172 | MemoryWriteWidth(memory, entry.width, entry.address, entry.value); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS - cycles_late, event); | 175 | core_timing.ScheduleEvent(MEMORY_FREEZER_TICKS - cycles_late, event); |
| @@ -181,7 +181,7 @@ void Freezer::FillEntryReads() { | |||
| 181 | LOG_DEBUG(Common_Memory, "Updating memory freeze entries to current values."); | 181 | LOG_DEBUG(Common_Memory, "Updating memory freeze entries to current values."); |
| 182 | 182 | ||
| 183 | for (auto& entry : entries) { | 183 | for (auto& entry : entries) { |
| 184 | entry.value = MemoryReadWidth(entry.width, entry.address); | 184 | entry.value = MemoryReadWidth(memory, entry.width, entry.address); |
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | 187 | ||
diff --git a/src/core/tools/freezer.h b/src/core/tools/freezer.h index 90b1a885c..916339c6c 100644 --- a/src/core/tools/freezer.h +++ b/src/core/tools/freezer.h | |||
| @@ -16,6 +16,10 @@ class CoreTiming; | |||
| 16 | struct EventType; | 16 | struct EventType; |
| 17 | } // namespace Core::Timing | 17 | } // namespace Core::Timing |
| 18 | 18 | ||
| 19 | namespace Memory { | ||
| 20 | class Memory; | ||
| 21 | } | ||
| 22 | |||
| 19 | namespace Tools { | 23 | namespace Tools { |
| 20 | 24 | ||
| 21 | /** | 25 | /** |
| @@ -34,7 +38,7 @@ public: | |||
| 34 | u64 value; | 38 | u64 value; |
| 35 | }; | 39 | }; |
| 36 | 40 | ||
| 37 | explicit Freezer(Core::Timing::CoreTiming& core_timing); | 41 | explicit Freezer(Core::Timing::CoreTiming& core_timing_, Memory::Memory& memory_); |
| 38 | ~Freezer(); | 42 | ~Freezer(); |
| 39 | 43 | ||
| 40 | // Enables or disables the entire memory freezer. | 44 | // Enables or disables the entire memory freezer. |
| @@ -78,6 +82,7 @@ private: | |||
| 78 | 82 | ||
| 79 | std::shared_ptr<Core::Timing::EventType> event; | 83 | std::shared_ptr<Core::Timing::EventType> event; |
| 80 | Core::Timing::CoreTiming& core_timing; | 84 | Core::Timing::CoreTiming& core_timing; |
| 85 | Memory::Memory& memory; | ||
| 81 | }; | 86 | }; |
| 82 | 87 | ||
| 83 | } // namespace Tools | 88 | } // namespace Tools |
diff --git a/src/video_core/rasterizer_accelerated.cpp b/src/video_core/rasterizer_accelerated.cpp index b230dcc18..f3dbadebc 100644 --- a/src/video_core/rasterizer_accelerated.cpp +++ b/src/video_core/rasterizer_accelerated.cpp | |||
| @@ -22,7 +22,8 @@ constexpr auto RangeFromInterval(Map& map, const Interval& interval) { | |||
| 22 | 22 | ||
| 23 | } // Anonymous namespace | 23 | } // Anonymous namespace |
| 24 | 24 | ||
| 25 | RasterizerAccelerated::RasterizerAccelerated() = default; | 25 | RasterizerAccelerated::RasterizerAccelerated(Memory::Memory& cpu_memory_) |
| 26 | : cpu_memory{cpu_memory_} {} | ||
| 26 | 27 | ||
| 27 | RasterizerAccelerated::~RasterizerAccelerated() = default; | 28 | RasterizerAccelerated::~RasterizerAccelerated() = default; |
| 28 | 29 | ||
diff --git a/src/video_core/rasterizer_accelerated.h b/src/video_core/rasterizer_accelerated.h index 8f7e3547e..315798e7c 100644 --- a/src/video_core/rasterizer_accelerated.h +++ b/src/video_core/rasterizer_accelerated.h | |||
| @@ -11,12 +11,16 @@ | |||
| 11 | #include "common/common_types.h" | 11 | #include "common/common_types.h" |
| 12 | #include "video_core/rasterizer_interface.h" | 12 | #include "video_core/rasterizer_interface.h" |
| 13 | 13 | ||
| 14 | namespace Memory { | ||
| 15 | class Memory; | ||
| 16 | } | ||
| 17 | |||
| 14 | namespace VideoCore { | 18 | namespace VideoCore { |
| 15 | 19 | ||
| 16 | /// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. | 20 | /// Implements the shared part in GPU accelerated rasterizers in RasterizerInterface. |
| 17 | class RasterizerAccelerated : public RasterizerInterface { | 21 | class RasterizerAccelerated : public RasterizerInterface { |
| 18 | public: | 22 | public: |
| 19 | explicit RasterizerAccelerated(); | 23 | explicit RasterizerAccelerated(Memory::Memory& cpu_memory_); |
| 20 | ~RasterizerAccelerated() override; | 24 | ~RasterizerAccelerated() override; |
| 21 | 25 | ||
| 22 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; | 26 | void UpdatePagesCachedCount(VAddr addr, u64 size, int delta) override; |
| @@ -24,8 +28,9 @@ public: | |||
| 24 | private: | 28 | private: |
| 25 | using CachedPageMap = boost::icl::interval_map<u64, int>; | 29 | using CachedPageMap = boost::icl::interval_map<u64, int>; |
| 26 | CachedPageMap cached_pages; | 30 | CachedPageMap cached_pages; |
| 27 | |||
| 28 | std::mutex pages_mutex; | 31 | std::mutex pages_mutex; |
| 32 | |||
| 33 | Memory::Memory& cpu_memory; | ||
| 29 | }; | 34 | }; |
| 30 | 35 | ||
| 31 | } // namespace VideoCore | 36 | } // namespace VideoCore |
diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index f97ec06f0..85f05544c 100644 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp | |||
| @@ -86,8 +86,9 @@ std::size_t GetConstBufferSize(const Tegra::Engines::ConstBufferInfo& buffer, | |||
| 86 | 86 | ||
| 87 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, | 87 | RasterizerOpenGL::RasterizerOpenGL(Core::System& system, Core::Frontend::EmuWindow& emu_window, |
| 88 | ScreenInfo& info) | 88 | ScreenInfo& info) |
| 89 | : texture_cache{system, *this, device}, shader_cache{*this, system, emu_window, device}, | 89 | : RasterizerAccelerated{system.Memory()}, texture_cache{system, *this, device}, |
| 90 | system{system}, screen_info{info}, buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} { | 90 | shader_cache{*this, system, emu_window, device}, system{system}, screen_info{info}, |
| 91 | buffer_cache{*this, system, device, STREAM_BUFFER_SIZE} { | ||
| 91 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); | 92 | shader_program_manager = std::make_unique<GLShader::ProgramManager>(); |
| 92 | state.draw.shader_program = 0; | 93 | state.draw.shader_program = 0; |
| 93 | state.Apply(); | 94 | state.Apply(); |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp index d2e9f4031..959638747 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.cpp | |||
| @@ -24,9 +24,11 @@ CachedBufferEntry::CachedBufferEntry(VAddr cpu_addr, std::size_t size, u64 offse | |||
| 24 | alignment{alignment} {} | 24 | alignment{alignment} {} |
| 25 | 25 | ||
| 26 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, | 26 | VKBufferCache::VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, |
| 27 | Memory::Memory& cpu_memory_, | ||
| 27 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, | 28 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, |
| 28 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) | 29 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size) |
| 29 | : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager} { | 30 | : RasterizerCache{rasterizer}, tegra_memory_manager{tegra_memory_manager}, cpu_memory{ |
| 31 | cpu_memory_} { | ||
| 30 | const auto usage = vk::BufferUsageFlagBits::eVertexBuffer | | 32 | const auto usage = vk::BufferUsageFlagBits::eVertexBuffer | |
| 31 | vk::BufferUsageFlagBits::eIndexBuffer | | 33 | vk::BufferUsageFlagBits::eIndexBuffer | |
| 32 | vk::BufferUsageFlagBits::eUniformBuffer; | 34 | vk::BufferUsageFlagBits::eUniformBuffer; |
diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index 49f13bcdc..daa8ccf66 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h | |||
| @@ -13,6 +13,10 @@ | |||
| 13 | #include "video_core/renderer_vulkan/declarations.h" | 13 | #include "video_core/renderer_vulkan/declarations.h" |
| 14 | #include "video_core/renderer_vulkan/vk_scheduler.h" | 14 | #include "video_core/renderer_vulkan/vk_scheduler.h" |
| 15 | 15 | ||
| 16 | namespace Memory { | ||
| 17 | class Memory; | ||
| 18 | } | ||
| 19 | |||
| 16 | namespace Tegra { | 20 | namespace Tegra { |
| 17 | class MemoryManager; | 21 | class MemoryManager; |
| 18 | } | 22 | } |
| @@ -58,7 +62,7 @@ private: | |||
| 58 | 62 | ||
| 59 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { | 63 | class VKBufferCache final : public RasterizerCache<std::shared_ptr<CachedBufferEntry>> { |
| 60 | public: | 64 | public: |
| 61 | explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, | 65 | explicit VKBufferCache(Tegra::MemoryManager& tegra_memory_manager, Memory::Memory& cpu_memory_, |
| 62 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, | 66 | VideoCore::RasterizerInterface& rasterizer, const VKDevice& device, |
| 63 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size); | 67 | VKMemoryManager& memory_manager, VKScheduler& scheduler, u64 size); |
| 64 | ~VKBufferCache(); | 68 | ~VKBufferCache(); |
| @@ -92,6 +96,7 @@ private: | |||
| 92 | void AlignBuffer(std::size_t alignment); | 96 | void AlignBuffer(std::size_t alignment); |
| 93 | 97 | ||
| 94 | Tegra::MemoryManager& tegra_memory_manager; | 98 | Tegra::MemoryManager& tegra_memory_manager; |
| 99 | Memory::Memory& cpu_memory; | ||
| 95 | 100 | ||
| 96 | std::unique_ptr<VKStreamBuffer> stream_buffer; | 101 | std::unique_ptr<VKStreamBuffer> stream_buffer; |
| 97 | vk::Buffer buffer_handle; | 102 | vk::Buffer buffer_handle; |