diff options
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; |