diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/frontend/emu_window.cpp | 2 | ||||
| -rw-r--r-- | src/core/frontend/emu_window.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audren_u.cpp | 63 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audren_u.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 2 | ||||
| -rw-r--r-- | src/core/memory.cpp | 17 |
6 files changed, 59 insertions, 30 deletions
diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 9dd493efb..e29afd630 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp | |||
| @@ -67,7 +67,7 @@ static bool IsWithinTouchscreen(const Layout::FramebufferLayout& layout, unsigne | |||
| 67 | framebuffer_x >= layout.screen.left && framebuffer_x < layout.screen.right); | 67 | framebuffer_x >= layout.screen.left && framebuffer_x < layout.screen.right); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | std::tuple<unsigned, unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) { | 70 | std::tuple<unsigned, unsigned> EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) const { |
| 71 | new_x = std::max(new_x, framebuffer_layout.screen.left); | 71 | new_x = std::max(new_x, framebuffer_layout.screen.left); |
| 72 | new_x = std::min(new_x, framebuffer_layout.screen.right - 1); | 72 | new_x = std::min(new_x, framebuffer_layout.screen.right - 1); |
| 73 | 73 | ||
diff --git a/src/core/frontend/emu_window.h b/src/core/frontend/emu_window.h index 7006a37b3..d0bcb4660 100644 --- a/src/core/frontend/emu_window.h +++ b/src/core/frontend/emu_window.h | |||
| @@ -166,7 +166,7 @@ private: | |||
| 166 | /** | 166 | /** |
| 167 | * Clip the provided coordinates to be inside the touchscreen area. | 167 | * Clip the provided coordinates to be inside the touchscreen area. |
| 168 | */ | 168 | */ |
| 169 | std::tuple<unsigned, unsigned> ClipToTouchScreen(unsigned new_x, unsigned new_y); | 169 | std::tuple<unsigned, unsigned> ClipToTouchScreen(unsigned new_x, unsigned new_y) const; |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | } // namespace Core::Frontend | 172 | } // namespace Core::Frontend |
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 7e0cc64a8..ea8f9d0bb 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -37,7 +37,7 @@ public: | |||
| 37 | {8, &IAudioRenderer::SetRenderingTimeLimit, "SetRenderingTimeLimit"}, | 37 | {8, &IAudioRenderer::SetRenderingTimeLimit, "SetRenderingTimeLimit"}, |
| 38 | {9, &IAudioRenderer::GetRenderingTimeLimit, "GetRenderingTimeLimit"}, | 38 | {9, &IAudioRenderer::GetRenderingTimeLimit, "GetRenderingTimeLimit"}, |
| 39 | {10, &IAudioRenderer::RequestUpdateImpl, "RequestUpdateAuto"}, | 39 | {10, &IAudioRenderer::RequestUpdateImpl, "RequestUpdateAuto"}, |
| 40 | {11, nullptr, "ExecuteAudioRendererRendering"}, | 40 | {11, &IAudioRenderer::ExecuteAudioRendererRendering, "ExecuteAudioRendererRendering"}, |
| 41 | }; | 41 | }; |
| 42 | // clang-format on | 42 | // clang-format on |
| 43 | RegisterHandlers(functions); | 43 | RegisterHandlers(functions); |
| @@ -138,6 +138,17 @@ private: | |||
| 138 | rb.Push(rendering_time_limit_percent); | 138 | rb.Push(rendering_time_limit_percent); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | void ExecuteAudioRendererRendering(Kernel::HLERequestContext& ctx) { | ||
| 142 | LOG_DEBUG(Service_Audio, "called"); | ||
| 143 | |||
| 144 | // This service command currently only reports an unsupported operation | ||
| 145 | // error code, or aborts. Given that, we just always return an error | ||
| 146 | // code in this case. | ||
| 147 | |||
| 148 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 149 | rb.Push(ResultCode{ErrorModule::Audio, 201}); | ||
| 150 | } | ||
| 151 | |||
| 141 | Kernel::EventPair system_event; | 152 | Kernel::EventPair system_event; |
| 142 | std::unique_ptr<AudioCore::AudioRenderer> renderer; | 153 | std::unique_ptr<AudioCore::AudioRenderer> renderer; |
| 143 | u32 rendering_time_limit_percent = 100; | 154 | u32 rendering_time_limit_percent = 100; |
| @@ -235,7 +246,7 @@ AudRenU::AudRenU() : ServiceFramework("audren:u") { | |||
| 235 | {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, | 246 | {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, |
| 236 | {1, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"}, | 247 | {1, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"}, |
| 237 | {2, &AudRenU::GetAudioDeviceService, "GetAudioDeviceService"}, | 248 | {2, &AudRenU::GetAudioDeviceService, "GetAudioDeviceService"}, |
| 238 | {3, nullptr, "OpenAudioRendererAuto"}, | 249 | {3, &AudRenU::OpenAudioRendererAuto, "OpenAudioRendererAuto"}, |
| 239 | {4, &AudRenU::GetAudioDeviceServiceWithRevisionInfo, "GetAudioDeviceServiceWithRevisionInfo"}, | 250 | {4, &AudRenU::GetAudioDeviceServiceWithRevisionInfo, "GetAudioDeviceServiceWithRevisionInfo"}, |
| 240 | }; | 251 | }; |
| 241 | // clang-format on | 252 | // clang-format on |
| @@ -248,12 +259,7 @@ AudRenU::~AudRenU() = default; | |||
| 248 | void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { | 259 | void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { |
| 249 | LOG_DEBUG(Service_Audio, "called"); | 260 | LOG_DEBUG(Service_Audio, "called"); |
| 250 | 261 | ||
| 251 | IPC::RequestParser rp{ctx}; | 262 | OpenAudioRendererImpl(ctx); |
| 252 | auto params = rp.PopRaw<AudioCore::AudioRendererParameter>(); | ||
| 253 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 254 | |||
| 255 | rb.Push(RESULT_SUCCESS); | ||
| 256 | rb.PushIpcInterface<Audio::IAudioRenderer>(std::move(params)); | ||
| 257 | } | 263 | } |
| 258 | 264 | ||
| 259 | void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | 265 | void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { |
| @@ -262,20 +268,20 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | |||
| 262 | LOG_DEBUG(Service_Audio, "called"); | 268 | LOG_DEBUG(Service_Audio, "called"); |
| 263 | 269 | ||
| 264 | u64 buffer_sz = Common::AlignUp(4 * params.mix_buffer_count, 0x40); | 270 | u64 buffer_sz = Common::AlignUp(4 * params.mix_buffer_count, 0x40); |
| 265 | buffer_sz += params.unknown_c * 1024; | 271 | buffer_sz += params.submix_count * 1024; |
| 266 | buffer_sz += 0x940 * (params.unknown_c + 1); | 272 | buffer_sz += 0x940 * (params.submix_count + 1); |
| 267 | buffer_sz += 0x3F0 * params.voice_count; | 273 | buffer_sz += 0x3F0 * params.voice_count; |
| 268 | buffer_sz += Common::AlignUp(8 * (params.unknown_c + 1), 0x10); | 274 | buffer_sz += Common::AlignUp(8 * (params.submix_count + 1), 0x10); |
| 269 | buffer_sz += Common::AlignUp(8 * params.voice_count, 0x10); | 275 | buffer_sz += Common::AlignUp(8 * params.voice_count, 0x10); |
| 270 | buffer_sz += | 276 | buffer_sz += Common::AlignUp( |
| 271 | Common::AlignUp((0x3C0 * (params.sink_count + params.unknown_c) + 4 * params.sample_count) * | 277 | (0x3C0 * (params.sink_count + params.submix_count) + 4 * params.sample_count) * |
| 272 | (params.mix_buffer_count + 6), | 278 | (params.mix_buffer_count + 6), |
| 273 | 0x40); | 279 | 0x40); |
| 274 | 280 | ||
| 275 | if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) { | 281 | if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) { |
| 276 | u32 count = params.unknown_c + 1; | 282 | const u32 count = params.submix_count + 1; |
| 277 | u64 node_count = Common::AlignUp(count, 0x40); | 283 | u64 node_count = Common::AlignUp(count, 0x40); |
| 278 | u64 node_state_buffer_sz = | 284 | const u64 node_state_buffer_sz = |
| 279 | 4 * (node_count * node_count) + 0xC * node_count + 2 * (node_count / 8); | 285 | 4 * (node_count * node_count) + 0xC * node_count + 2 * (node_count / 8); |
| 280 | u64 edge_matrix_buffer_sz = 0; | 286 | u64 edge_matrix_buffer_sz = 0; |
| 281 | node_count = Common::AlignUp(count * count, 0x40); | 287 | node_count = Common::AlignUp(count * count, 0x40); |
| @@ -289,19 +295,19 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | |||
| 289 | 295 | ||
| 290 | buffer_sz += 0x20 * (params.effect_count + 4 * params.voice_count) + 0x50; | 296 | buffer_sz += 0x20 * (params.effect_count + 4 * params.voice_count) + 0x50; |
| 291 | if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) { | 297 | if (IsFeatureSupported(AudioFeatures::Splitter, params.revision)) { |
| 292 | buffer_sz += 0xE0 * params.unknown_2c; | 298 | buffer_sz += 0xE0 * params.num_splitter_send_channels; |
| 293 | buffer_sz += 0x20 * params.splitter_count; | 299 | buffer_sz += 0x20 * params.splitter_count; |
| 294 | buffer_sz += Common::AlignUp(4 * params.unknown_2c, 0x10); | 300 | buffer_sz += Common::AlignUp(4 * params.num_splitter_send_channels, 0x10); |
| 295 | } | 301 | } |
| 296 | buffer_sz = Common::AlignUp(buffer_sz, 0x40) + 0x170 * params.sink_count; | 302 | buffer_sz = Common::AlignUp(buffer_sz, 0x40) + 0x170 * params.sink_count; |
| 297 | u64 output_sz = buffer_sz + 0x280 * params.sink_count + 0x4B0 * params.effect_count + | 303 | u64 output_sz = buffer_sz + 0x280 * params.sink_count + 0x4B0 * params.effect_count + |
| 298 | ((params.voice_count * 256) | 0x40); | 304 | ((params.voice_count * 256) | 0x40); |
| 299 | 305 | ||
| 300 | if (params.unknown_1c >= 1) { | 306 | if (params.performance_frame_count >= 1) { |
| 301 | output_sz = Common::AlignUp(((16 * params.sink_count + 16 * params.effect_count + | 307 | output_sz = Common::AlignUp(((16 * params.sink_count + 16 * params.effect_count + |
| 302 | 16 * params.voice_count + 16) + | 308 | 16 * params.voice_count + 16) + |
| 303 | 0x658) * | 309 | 0x658) * |
| 304 | (params.unknown_1c + 1) + | 310 | (params.performance_frame_count + 1) + |
| 305 | 0xc0, | 311 | 0xc0, |
| 306 | 0x40) + | 312 | 0x40) + |
| 307 | output_sz; | 313 | output_sz; |
| @@ -325,6 +331,12 @@ void AudRenU::GetAudioDeviceService(Kernel::HLERequestContext& ctx) { | |||
| 325 | rb.PushIpcInterface<Audio::IAudioDevice>(); | 331 | rb.PushIpcInterface<Audio::IAudioDevice>(); |
| 326 | } | 332 | } |
| 327 | 333 | ||
| 334 | void AudRenU::OpenAudioRendererAuto(Kernel::HLERequestContext& ctx) { | ||
| 335 | LOG_DEBUG(Service_Audio, "called"); | ||
| 336 | |||
| 337 | OpenAudioRendererImpl(ctx); | ||
| 338 | } | ||
| 339 | |||
| 328 | void AudRenU::GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& ctx) { | 340 | void AudRenU::GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& ctx) { |
| 329 | LOG_WARNING(Service_Audio, "(STUBBED) called"); | 341 | LOG_WARNING(Service_Audio, "(STUBBED) called"); |
| 330 | 342 | ||
| @@ -335,6 +347,15 @@ void AudRenU::GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& c | |||
| 335 | // based on the current revision | 347 | // based on the current revision |
| 336 | } | 348 | } |
| 337 | 349 | ||
| 350 | void AudRenU::OpenAudioRendererImpl(Kernel::HLERequestContext& ctx) { | ||
| 351 | IPC::RequestParser rp{ctx}; | ||
| 352 | const auto params = rp.PopRaw<AudioCore::AudioRendererParameter>(); | ||
| 353 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 354 | |||
| 355 | rb.Push(RESULT_SUCCESS); | ||
| 356 | rb.PushIpcInterface<IAudioRenderer>(params); | ||
| 357 | } | ||
| 358 | |||
| 338 | bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le revision) const { | 359 | bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le revision) const { |
| 339 | u32_be version_num = (revision - Common::MakeMagic('R', 'E', 'V', '0')); // Byte swap | 360 | u32_be version_num = (revision - Common::MakeMagic('R', 'E', 'V', '0')); // Byte swap |
| 340 | switch (feature) { | 361 | switch (feature) { |
diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 3d63388fb..e55d25973 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h | |||
| @@ -21,8 +21,11 @@ private: | |||
| 21 | void OpenAudioRenderer(Kernel::HLERequestContext& ctx); | 21 | void OpenAudioRenderer(Kernel::HLERequestContext& ctx); |
| 22 | void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); | 22 | void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); |
| 23 | void GetAudioDeviceService(Kernel::HLERequestContext& ctx); | 23 | void GetAudioDeviceService(Kernel::HLERequestContext& ctx); |
| 24 | void OpenAudioRendererAuto(Kernel::HLERequestContext& ctx); | ||
| 24 | void GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& ctx); | 25 | void GetAudioDeviceServiceWithRevisionInfo(Kernel::HLERequestContext& ctx); |
| 25 | 26 | ||
| 27 | void OpenAudioRendererImpl(Kernel::HLERequestContext& ctx); | ||
| 28 | |||
| 26 | enum class AudioFeatures : u32 { | 29 | enum class AudioFeatures : u32 { |
| 27 | Splitter, | 30 | Splitter, |
| 28 | }; | 31 | }; |
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index 6d897c842..7cc58db4c 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h | |||
| @@ -15,7 +15,7 @@ namespace Kernel { | |||
| 15 | class SharedMemory; | 15 | class SharedMemory; |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | namespace SM { | 18 | namespace Service::SM { |
| 19 | class ServiceManager; | 19 | class ServiceManager; |
| 20 | } | 20 | } |
| 21 | 21 | ||
diff --git a/src/core/memory.cpp b/src/core/memory.cpp index e9166dbd9..f809567b6 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp | |||
| @@ -71,15 +71,20 @@ static void MapPages(PageTable& page_table, VAddr base, u64 size, u8* memory, Pa | |||
| 71 | FlushMode::FlushAndInvalidate); | 71 | FlushMode::FlushAndInvalidate); |
| 72 | 72 | ||
| 73 | VAddr end = base + size; | 73 | VAddr end = base + size; |
| 74 | while (base != end) { | 74 | ASSERT_MSG(end <= page_table.pointers.size(), "out of range mapping at {:016X}", |
| 75 | ASSERT_MSG(base < page_table.pointers.size(), "out of range mapping at {:016X}", base); | 75 | base + page_table.pointers.size()); |
| 76 | 76 | ||
| 77 | page_table.attributes[base] = type; | 77 | std::fill(page_table.attributes.begin() + base, page_table.attributes.begin() + end, type); |
| 78 | page_table.pointers[base] = memory; | ||
| 79 | 78 | ||
| 80 | base += 1; | 79 | if (memory == nullptr) { |
| 81 | if (memory != nullptr) | 80 | std::fill(page_table.pointers.begin() + base, page_table.pointers.begin() + end, memory); |
| 81 | } else { | ||
| 82 | while (base != end) { | ||
| 83 | page_table.pointers[base] = memory; | ||
| 84 | |||
| 85 | base += 1; | ||
| 82 | memory += PAGE_SIZE; | 86 | memory += PAGE_SIZE; |
| 87 | } | ||
| 83 | } | 88 | } |
| 84 | } | 89 | } |
| 85 | 90 | ||