summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.h2
-rw-r--r--src/input_common/mouse/mouse_poller.cpp2
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pass.cpp33
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp6
-rw-r--r--src/video_core/texture_cache/texture_cache.h6
-rw-r--r--src/video_core/texture_cache/util.cpp86
-rw-r--r--src/yuzu/bootmanager.cpp9
-rw-r--r--src/yuzu/configuration/configure_audio.cpp12
-rw-r--r--src/yuzu_cmd/config.cpp24
-rw-r--r--src/yuzu_cmd/default_ini.h142
10 files changed, 182 insertions, 140 deletions
diff --git a/src/common/settings.h b/src/common/settings.h
index 832358036..ce1bc647d 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -368,7 +368,7 @@ struct Values {
368 "udp_input_servers"}; 368 "udp_input_servers"};
369 369
370 BasicSetting<bool> mouse_panning{false, "mouse_panning"}; 370 BasicSetting<bool> mouse_panning{false, "mouse_panning"};
371 BasicSetting<u8> mouse_panning_sensitivity{1, "mouse_panning_sensitivity"}; 371 BasicSetting<u8> mouse_panning_sensitivity{10, "mouse_panning_sensitivity"};
372 BasicSetting<bool> mouse_enabled{false, "mouse_enabled"}; 372 BasicSetting<bool> mouse_enabled{false, "mouse_enabled"};
373 std::string mouse_device; 373 std::string mouse_device;
374 MouseButtonsRaw mouse_buttons; 374 MouseButtonsRaw mouse_buttons;
diff --git a/src/input_common/mouse/mouse_poller.cpp b/src/input_common/mouse/mouse_poller.cpp
index 1e84eaddd..efcdd85d2 100644
--- a/src/input_common/mouse/mouse_poller.cpp
+++ b/src/input_common/mouse/mouse_poller.cpp
@@ -84,7 +84,7 @@ public:
84 std::lock_guard lock{mutex}; 84 std::lock_guard lock{mutex};
85 const auto axis_value = 85 const auto axis_value =
86 static_cast<float>(mouse_input->GetMouseState(button).axis.at(axis)); 86 static_cast<float>(mouse_input->GetMouseState(button).axis.at(axis));
87 const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue() * 0.15f; 87 const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue() * 0.10f;
88 return axis_value * sensitivity / (100.0f * range); 88 return axis_value * sensitivity / (100.0f * range);
89 } 89 }
90 90
diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp
index 205cd3b05..4181d83ee 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp
+++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp
@@ -374,20 +374,20 @@ void ASTCDecoderPass::MakeDataBuffer() {
374 374
375 scheduler.Record([src = staging_ref.buffer, offset = staging_ref.offset, dst = *data_buffer, 375 scheduler.Record([src = staging_ref.buffer, offset = staging_ref.offset, dst = *data_buffer,
376 TOTAL_BUFFER_SIZE](vk::CommandBuffer cmdbuf) { 376 TOTAL_BUFFER_SIZE](vk::CommandBuffer cmdbuf) {
377 cmdbuf.CopyBuffer(src, dst, 377 static constexpr VkMemoryBarrier write_barrier{
378 VkBufferCopy{ 378 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER,
379 .srcOffset = offset, 379 .pNext = nullptr,
380 .dstOffset = 0, 380 .srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
381 .size = TOTAL_BUFFER_SIZE, 381 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT,
382 }); 382 };
383 cmdbuf.PipelineBarrier( 383 const VkBufferCopy copy{
384 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 384 .srcOffset = offset,
385 VkMemoryBarrier{ 385 .dstOffset = 0,
386 .sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER, 386 .size = TOTAL_BUFFER_SIZE,
387 .pNext = nullptr, 387 };
388 .srcAccessMask = 0, 388 cmdbuf.CopyBuffer(src, dst, copy);
389 .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT, 389 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
390 }); 390 0, write_barrier);
391 }); 391 });
392} 392}
393 393
@@ -411,7 +411,7 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map,
411 const VkImageMemoryBarrier image_barrier{ 411 const VkImageMemoryBarrier image_barrier{
412 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 412 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
413 .pNext = nullptr, 413 .pNext = nullptr,
414 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, 414 .srcAccessMask = is_initialized ? VK_ACCESS_SHADER_WRITE_BIT : VkAccessFlags{},
415 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT, 415 .dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
416 .oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED, 416 .oldLayout = is_initialized ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_UNDEFINED,
417 .newLayout = VK_IMAGE_LAYOUT_GENERAL, 417 .newLayout = VK_IMAGE_LAYOUT_GENERAL,
@@ -426,7 +426,8 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map,
426 .layerCount = VK_REMAINING_ARRAY_LAYERS, 426 .layerCount = VK_REMAINING_ARRAY_LAYERS,
427 }, 427 },
428 }; 428 };
429 cmdbuf.PipelineBarrier(is_initialized ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT : 0, 429 cmdbuf.PipelineBarrier(is_initialized ? VK_PIPELINE_STAGE_ALL_COMMANDS_BIT
430 : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
430 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, image_barrier); 431 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0, image_barrier);
431 cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, vk_pipeline); 432 cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, vk_pipeline);
432 }); 433 });
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index a2ab4d1ee..fd01c902c 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -608,7 +608,10 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst
608 const VkImageAspectFlags aspect_mask = ImageAspectMask(src.format); 608 const VkImageAspectFlags aspect_mask = ImageAspectMask(src.format);
609 const bool is_dst_msaa = dst.Samples() != VK_SAMPLE_COUNT_1_BIT; 609 const bool is_dst_msaa = dst.Samples() != VK_SAMPLE_COUNT_1_BIT;
610 const bool is_src_msaa = src.Samples() != VK_SAMPLE_COUNT_1_BIT; 610 const bool is_src_msaa = src.Samples() != VK_SAMPLE_COUNT_1_BIT;
611 ASSERT(aspect_mask == ImageAspectMask(dst.format)); 611 if (aspect_mask != ImageAspectMask(dst.format)) {
612 UNIMPLEMENTED_MSG("Incompatible blit from format {} to {}", src.format, dst.format);
613 return;
614 }
612 if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT && !is_src_msaa && !is_dst_msaa) { 615 if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT && !is_src_msaa && !is_dst_msaa) {
613 blit_image_helper.BlitColor(dst_framebuffer, src, dst_region, src_region, filter, 616 blit_image_helper.BlitColor(dst_framebuffer, src, dst_region, src_region, filter,
614 operation); 617 operation);
@@ -911,6 +914,7 @@ void Image::UploadMemory(const StagingBufferRef& map,
911 914
912void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { 915void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) {
913 std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask); 916 std::vector vk_copies = TransformBufferImageCopies(copies, map.offset, aspect_mask);
917 scheduler->RequestOutsideRenderPassOperationContext();
914 scheduler->Record([buffer = map.buffer, image = *image, aspect_mask = aspect_mask, 918 scheduler->Record([buffer = map.buffer, image = *image, aspect_mask = aspect_mask,
915 vk_copies](vk::CommandBuffer cmdbuf) { 919 vk_copies](vk::CommandBuffer cmdbuf) {
916 const VkImageMemoryBarrier read_barrier{ 920 const VkImageMemoryBarrier read_barrier{
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 01de2d498..85ce06d56 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -599,6 +599,12 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) {
599 using namespace VideoCommon::Dirty; 599 using namespace VideoCommon::Dirty;
600 auto& flags = maxwell3d.dirty.flags; 600 auto& flags = maxwell3d.dirty.flags;
601 if (!flags[Dirty::RenderTargets]) { 601 if (!flags[Dirty::RenderTargets]) {
602 for (size_t index = 0; index < NUM_RT; ++index) {
603 ImageViewId& color_buffer_id = render_targets.color_buffer_ids[index];
604 PrepareImageView(color_buffer_id, true, is_clear && IsFullClear(color_buffer_id));
605 }
606 const ImageViewId depth_buffer_id = render_targets.depth_buffer_id;
607 PrepareImageView(depth_buffer_id, true, is_clear && IsFullClear(depth_buffer_id));
602 return; 608 return;
603 } 609 }
604 flags[Dirty::RenderTargets] = false; 610 flags[Dirty::RenderTargets] = false;
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp
index c872517b8..59cf2f561 100644
--- a/src/video_core/texture_cache/util.cpp
+++ b/src/video_core/texture_cache/util.cpp
@@ -169,23 +169,6 @@ template <u32 GOB_EXTENT>
169 return Common::DivCeil(AdjustMipSize(size, level), block_size); 169 return Common::DivCeil(AdjustMipSize(size, level), block_size);
170} 170}
171 171
172[[nodiscard]] constexpr std::pair<int, int> Samples(int num_samples) {
173 switch (num_samples) {
174 case 1:
175 return {1, 1};
176 case 2:
177 return {2, 1};
178 case 4:
179 return {2, 2};
180 case 8:
181 return {4, 2};
182 case 16:
183 return {4, 4};
184 }
185 UNREACHABLE_MSG("Invalid number of samples={}", num_samples);
186 return {1, 1};
187}
188
189[[nodiscard]] constexpr Extent2D DefaultBlockSize(PixelFormat format) { 172[[nodiscard]] constexpr Extent2D DefaultBlockSize(PixelFormat format) {
190 return {DefaultBlockWidth(format), DefaultBlockHeight(format)}; 173 return {DefaultBlockWidth(format), DefaultBlockHeight(format)};
191} 174}
@@ -283,14 +266,13 @@ template <u32 GOB_EXTENT>
283} 266}
284 267
285[[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block, 268[[nodiscard]] constexpr LevelInfo MakeLevelInfo(PixelFormat format, Extent3D size, Extent3D block,
286 u32 num_samples, u32 tile_width_spacing) { 269 u32 tile_width_spacing) {
287 const auto [samples_x, samples_y] = Samples(num_samples);
288 const u32 bytes_per_block = BytesPerBlock(format); 270 const u32 bytes_per_block = BytesPerBlock(format);
289 return { 271 return {
290 .size = 272 .size =
291 { 273 {
292 .width = size.width * samples_x, 274 .width = size.width,
293 .height = size.height * samples_y, 275 .height = size.height,
294 .depth = size.depth, 276 .depth = size.depth,
295 }, 277 },
296 .block = block, 278 .block = block,
@@ -301,14 +283,12 @@ template <u32 GOB_EXTENT>
301} 283}
302 284
303[[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) { 285[[nodiscard]] constexpr LevelInfo MakeLevelInfo(const ImageInfo& info) {
304 return MakeLevelInfo(info.format, info.size, info.block, info.num_samples, 286 return MakeLevelInfo(info.format, info.size, info.block, info.tile_width_spacing);
305 info.tile_width_spacing);
306} 287}
307 288
308[[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block, 289[[nodiscard]] constexpr u32 CalculateLevelOffset(PixelFormat format, Extent3D size, Extent3D block,
309 u32 num_samples, u32 tile_width_spacing, 290 u32 tile_width_spacing, u32 level) {
310 u32 level) { 291 const LevelInfo info = MakeLevelInfo(format, size, block, tile_width_spacing);
311 const LevelInfo info = MakeLevelInfo(format, size, block, num_samples, tile_width_spacing);
312 u32 offset = 0; 292 u32 offset = 0;
313 for (u32 current_level = 0; current_level < level; ++current_level) { 293 for (u32 current_level = 0; current_level < level; ++current_level) {
314 offset += CalculateLevelSize(info, current_level); 294 offset += CalculateLevelSize(info, current_level);
@@ -645,8 +625,8 @@ u32 CalculateLayerStride(const ImageInfo& info) noexcept {
645 625
646u32 CalculateLayerSize(const ImageInfo& info) noexcept { 626u32 CalculateLayerSize(const ImageInfo& info) noexcept {
647 ASSERT(info.type != ImageType::Linear); 627 ASSERT(info.type != ImageType::Linear);
648 return CalculateLevelOffset(info.format, info.size, info.block, info.num_samples, 628 return CalculateLevelOffset(info.format, info.size, info.block, info.tile_width_spacing,
649 info.tile_width_spacing, info.resources.levels); 629 info.resources.levels);
650} 630}
651 631
652LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept { 632LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept {
@@ -1195,37 +1175,37 @@ static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2
1195 0x7f8000); 1175 0x7f8000);
1196static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); 1176static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000);
1197 1177
1198static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 1, 0, 7) == 1178static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 0, 7) ==
1199 0x2afc00); 1179 0x2afc00);
1200static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 1, 1180static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 0,
1201 0, 12) == 0x50d200); 1181 12) == 0x50d200);
1202 1182
1203static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1183static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 0) ==
1204 0) == 0); 1184 0);
1205static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1185static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 1) ==
1206 1) == 0x400000); 1186 0x400000);
1207static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1187static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 2) ==
1208 2) == 0x500000); 1188 0x500000);
1209static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1189static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 3) ==
1210 3) == 0x540000); 1190 0x540000);
1211static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1191static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 4) ==
1212 4) == 0x550000); 1192 0x550000);
1213static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1193static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 5) ==
1214 5) == 0x554000); 1194 0x554000);
1215static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1195static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 6) ==
1216 6) == 0x555000); 1196 0x555000);
1217static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1197static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 7) ==
1218 7) == 0x555400); 1198 0x555400);
1219static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1199static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 8) ==
1220 8) == 0x555600); 1200 0x555600);
1221static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, 1201static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 9) ==
1222 9) == 0x555800); 1202 0x555800);
1223 1203
1224constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height, 1204constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height,
1225 u32 tile_width_spacing, u32 level) { 1205 u32 tile_width_spacing, u32 level) {
1226 const Extent3D size{width, height, 1}; 1206 const Extent3D size{width, height, 1};
1227 const Extent3D block{0, block_height, 0}; 1207 const Extent3D block{0, block_height, 0};
1228 const u32 offset = CalculateLevelOffset(format, size, block, 1, tile_width_spacing, level); 1208 const u32 offset = CalculateLevelOffset(format, size, block, tile_width_spacing, level);
1229 return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing); 1209 return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing);
1230} 1210}
1231 1211
diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp
index 7524e3c40..bfae73b60 100644
--- a/src/yuzu/bootmanager.cpp
+++ b/src/yuzu/bootmanager.cpp
@@ -411,8 +411,9 @@ void GRenderWindow::mousePressEvent(QMouseEvent* event) {
411 if (event->source() == Qt::MouseEventSynthesizedBySystem) { 411 if (event->source() == Qt::MouseEventSynthesizedBySystem) {
412 return; 412 return;
413 } 413 }
414 414 // Qt sometimes returns the parent coordinates. To avoid this we read the global mouse
415 auto pos = event->pos(); 415 // coordinates and map them to the current render area
416 const auto pos = mapFromGlobal(QCursor::pos());
416 const auto [x, y] = ScaleTouch(pos); 417 const auto [x, y] = ScaleTouch(pos);
417 const auto button = QtButtonToMouseButton(event->button()); 418 const auto button = QtButtonToMouseButton(event->button());
418 input_subsystem->GetMouse()->PressButton(x, y, button); 419 input_subsystem->GetMouse()->PressButton(x, y, button);
@@ -429,7 +430,9 @@ void GRenderWindow::mouseMoveEvent(QMouseEvent* event) {
429 if (event->source() == Qt::MouseEventSynthesizedBySystem) { 430 if (event->source() == Qt::MouseEventSynthesizedBySystem) {
430 return; 431 return;
431 } 432 }
432 auto pos = event->pos(); 433 // Qt sometimes returns the parent coordinates. To avoid this we read the global mouse
434 // coordinates and map them to the current render area
435 const auto pos = mapFromGlobal(QCursor::pos());
433 const auto [x, y] = ScaleTouch(pos); 436 const auto [x, y] = ScaleTouch(pos);
434 const int center_x = width() / 2; 437 const int center_x = width() / 2;
435 const int center_y = height() / 2; 438 const int center_y = height() / 2;
diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp
index d8ba939d2..1d84bf4ed 100644
--- a/src/yuzu/configuration/configure_audio.cpp
+++ b/src/yuzu/configuration/configure_audio.cpp
@@ -47,8 +47,8 @@ void ConfigureAudio::SetConfiguration() {
47 47
48 SetAudioDeviceFromDeviceID(); 48 SetAudioDeviceFromDeviceID();
49 49
50 const auto volume_value = Settings::values.volume.GetValue() * ui->volume_slider->maximum(); 50 const auto volume_value = static_cast<int>(Settings::values.volume.GetValue());
51 ui->volume_slider->setValue(volume_value / 100); 51 ui->volume_slider->setValue(volume_value);
52 52
53 ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching.GetValue()); 53 ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching.GetValue());
54 54
@@ -113,16 +113,16 @@ void ConfigureAudio::ApplyConfiguration() {
113 113
114 // Guard if during game and set to game-specific value 114 // Guard if during game and set to game-specific value
115 if (Settings::values.volume.UsingGlobal()) { 115 if (Settings::values.volume.UsingGlobal()) {
116 const s32 volume = ui->volume_slider->sliderPosition() / ui->volume_slider->maximum(); 116 const auto volume = static_cast<u8>(ui->volume_slider->value());
117 Settings::values.volume.SetValue(static_cast<u8>(100 * volume)); 117 Settings::values.volume.SetValue(volume);
118 } 118 }
119 } else { 119 } else {
120 if (ui->volume_combo_box->currentIndex() == 0) { 120 if (ui->volume_combo_box->currentIndex() == 0) {
121 Settings::values.volume.SetGlobal(true); 121 Settings::values.volume.SetGlobal(true);
122 } else { 122 } else {
123 Settings::values.volume.SetGlobal(false); 123 Settings::values.volume.SetGlobal(false);
124 const s32 volume = ui->volume_slider->sliderPosition() / ui->volume_slider->maximum(); 124 const auto volume = static_cast<u8>(ui->volume_slider->value());
125 Settings::values.volume.SetValue(static_cast<u8>(100 * volume)); 125 Settings::values.volume.SetValue(volume);
126 } 126 }
127 } 127 }
128} 128}
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 23ada3f92..b18056baf 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -292,6 +292,8 @@ void Config::ReadValues() {
292 292
293 ReadSetting("ControlsGeneral", Settings::values.motion_device); 293 ReadSetting("ControlsGeneral", Settings::values.motion_device);
294 294
295 ReadSetting("ControlsGeneral", Settings::values.touch_device);
296
295 ReadSetting("ControlsGeneral", Settings::values.keyboard_enabled); 297 ReadSetting("ControlsGeneral", Settings::values.keyboard_enabled);
296 298
297 ReadSetting("ControlsGeneral", Settings::values.debug_pad_enabled); 299 ReadSetting("ControlsGeneral", Settings::values.debug_pad_enabled);
@@ -414,11 +416,31 @@ void Config::ReadValues() {
414 } 416 }
415 417
416 ReadSetting("System", Settings::values.language_index); 418 ReadSetting("System", Settings::values.language_index);
419 ReadSetting("System", Settings::values.region_index);
417 ReadSetting("System", Settings::values.time_zone_index); 420 ReadSetting("System", Settings::values.time_zone_index);
421 ReadSetting("System", Settings::values.sound_index);
418 422
419 // Core 423 // Core
420 ReadSetting("Core", Settings::values.use_multi_core); 424 ReadSetting("Core", Settings::values.use_multi_core);
421 425
426 // Cpu
427 ReadSetting("Cpu", Settings::values.cpu_accuracy);
428 ReadSetting("Cpu", Settings::values.cpu_debug_mode);
429 ReadSetting("Cpu", Settings::values.cpuopt_page_tables);
430 ReadSetting("Cpu", Settings::values.cpuopt_block_linking);
431 ReadSetting("Cpu", Settings::values.cpuopt_return_stack_buffer);
432 ReadSetting("Cpu", Settings::values.cpuopt_fast_dispatcher);
433 ReadSetting("Cpu", Settings::values.cpuopt_context_elimination);
434 ReadSetting("Cpu", Settings::values.cpuopt_const_prop);
435 ReadSetting("Cpu", Settings::values.cpuopt_misc_ir);
436 ReadSetting("Cpu", Settings::values.cpuopt_reduce_misalign_checks);
437 ReadSetting("Cpu", Settings::values.cpuopt_fastmem);
438 ReadSetting("Cpu", Settings::values.cpuopt_unsafe_unfuse_fma);
439 ReadSetting("Cpu", Settings::values.cpuopt_unsafe_reduce_fp_error);
440 ReadSetting("Cpu", Settings::values.cpuopt_unsafe_ignore_standard_fpcr);
441 ReadSetting("Cpu", Settings::values.cpuopt_unsafe_inaccurate_nan);
442 ReadSetting("Cpu", Settings::values.cpuopt_unsafe_fastmem_check);
443
422 // Renderer 444 // Renderer
423 ReadSetting("Renderer", Settings::values.renderer_backend); 445 ReadSetting("Renderer", Settings::values.renderer_backend);
424 ReadSetting("Renderer", Settings::values.renderer_debug); 446 ReadSetting("Renderer", Settings::values.renderer_debug);
@@ -438,6 +460,7 @@ void Config::ReadValues() {
438 ReadSetting("Renderer", Settings::values.use_nvdec_emulation); 460 ReadSetting("Renderer", Settings::values.use_nvdec_emulation);
439 ReadSetting("Renderer", Settings::values.accelerate_astc); 461 ReadSetting("Renderer", Settings::values.accelerate_astc);
440 ReadSetting("Renderer", Settings::values.use_fast_gpu_time); 462 ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
463 ReadSetting("Renderer", Settings::values.use_caches_gc);
441 464
442 ReadSetting("Renderer", Settings::values.bg_red); 465 ReadSetting("Renderer", Settings::values.bg_red);
443 ReadSetting("Renderer", Settings::values.bg_green); 466 ReadSetting("Renderer", Settings::values.bg_green);
@@ -458,7 +481,6 @@ void Config::ReadValues() {
458 // Debugging 481 // Debugging
459 Settings::values.record_frame_times = 482 Settings::values.record_frame_times =
460 sdl2_config->GetBoolean("Debugging", "record_frame_times", false); 483 sdl2_config->GetBoolean("Debugging", "record_frame_times", false);
461 ReadSetting("Debugging", Settings::values.program_args);
462 ReadSetting("Debugging", Settings::values.dump_exefs); 484 ReadSetting("Debugging", Settings::values.dump_exefs);
463 ReadSetting("Debugging", Settings::values.dump_nso); 485 ReadSetting("Debugging", Settings::values.dump_nso);
464 ReadSetting("Debugging", Settings::values.enable_fs_access_log); 486 ReadSetting("Debugging", Settings::values.enable_fs_access_log);
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index 7d6bcccc7..b362f10b4 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -65,6 +65,13 @@ button_screenshot=
65lstick= 65lstick=
66rstick= 66rstick=
67 67
68# To use the debug_pad, prepend `debug_pad_` before each button setting above.
69# i.e. debug_pad_button_a=
70
71# Enable debug pad inputs to the guest
72# 0 (default): Disabled, 1: Enabled
73debug_pad_enabled =
74
68# Whether to enable or disable vibration 75# Whether to enable or disable vibration
69# 0: Disabled, 1 (default): Enabled 76# 0: Disabled, 1 (default): Enabled
70vibration_enabled= 77vibration_enabled=
@@ -73,6 +80,10 @@ vibration_enabled=
73# 0 (default): Disabled, 1: Enabled 80# 0 (default): Disabled, 1: Enabled
74enable_accurate_vibrations= 81enable_accurate_vibrations=
75 82
83# Enables controller motion inputs
84# 0: Disabled, 1 (default): Enabled
85motion_enabled =
86
76# for motion input, the following devices are available: 87# for motion input, the following devices are available:
77# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: 88# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
78# - "update_period": update period in milliseconds (default to 100) 89# - "update_period": update period in milliseconds (default to 100)
@@ -98,19 +109,30 @@ use_touch_from_button=
98#touch_from_button_maps_0_bind_1=bar 109#touch_from_button_maps_0_bind_1=bar
99# etc. 110# etc.
100 111
101# Most desktop operating systems do not expose a way to poll the motion state of the controllers 112# List of Cemuhook UDP servers, delimited by ','.
102# so as a way around it, cemuhook created a udp client/server protocol to broadcast the data directly 113# Default: 127.0.0.1:26760
103# from a controller device to the client program. Citra has a client that can connect and read 114# Example: 127.0.0.1:26760,123.4.5.67:26761
104# from any cemuhook compatible motion program. 115udp_input_servers =
105 116
106# IPv4 address of the udp input server (Default "127.0.0.1") 117# Enable controlling an axis via a mouse input.
107udp_input_address=127.0.0.1 118# 0 (default): Off, 1: On
119mouse_panning =
120
121# Set mouse sensitivity.
122# Default: 1.0
123mouse_panning_sensitivity =
124
125# Emulate an analog control stick from keyboard inputs.
126# 0 (default): Disabled, 1: Enabled
127emulate_analog_keyboard =
108 128
109# Port of the udp input server. (Default 26760) 129# Enable mouse inputs to the guest
110udp_input_port= 130# 0 (default): Disabled, 1: Enabled
131mouse_enabled =
111 132
112# The pad to request data on. Should be between 0 (Pad 1) and 3 (Pad 4). (Default 0) 133# Enable keyboard inputs to the guest
113udp_pad_index= 134# 0 (default): Disabled, 1: Enabled
135keyboard_enabled =
114 136
115[Core] 137[Core]
116# Whether to use multi-core for CPU emulation 138# Whether to use multi-core for CPU emulation
@@ -118,6 +140,17 @@ udp_pad_index=
118use_multi_core= 140use_multi_core=
119 141
120[Cpu] 142[Cpu]
143# Adjusts various optimizations.
144# Auto-select mode enables choice unsafe optimizations.
145# Accurate enables only safe optimizations.
146# Unsafe allows any unsafe optimizations.
147# 0 (default): Auto-select, 1: Accurate, 2: Enable unsafe optimizations
148cpu_accuracy =
149
150# Allow disabling safe optimizations.
151# 0 (default): Disabled, 1: Enabled
152cpu_debug_mode =
153
121# Enable inline page tables optimization (faster guest memory access) 154# Enable inline page tables optimization (faster guest memory access)
122# 0: Disabled, 1 (default): Enabled 155# 0: Disabled, 1 (default): Enabled
123cpuopt_page_tables = 156cpuopt_page_tables =
@@ -154,6 +187,31 @@ cpuopt_reduce_misalign_checks =
154# 0: Disabled, 1 (default): Enabled 187# 0: Disabled, 1 (default): Enabled
155cpuopt_fastmem = 188cpuopt_fastmem =
156 189
190# Enable unfuse FMA (improve performance on CPUs without FMA)
191# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
192# 0: Disabled, 1 (default): Enabled
193cpuopt_unsafe_unfuse_fma =
194
195# Enable faster FRSQRTE and FRECPE
196# Only enabled if cpu_accuracy is set to Unsafe.
197# 0: Disabled, 1 (default): Enabled
198cpuopt_unsafe_reduce_fp_error =
199
200# Enable faster ASIMD instructions (32 bits only)
201# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
202# 0: Disabled, 1 (default): Enabled
203cpuopt_unsafe_ignore_standard_fpcr =
204
205# Enable inaccurate NaN handling
206# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
207# 0: Disabled, 1 (default): Enabled
208cpuopt_unsafe_inaccurate_nan =
209
210# Disable address space checks (64 bits only)
211# Only enabled if cpu_accuracy is set to Unsafe. Automatically chosen with cpu_accuracy = Auto-select.
212# 0: Disabled, 1 (default): Enabled
213cpuopt_unsafe_fastmem_check =
214
157[Renderer] 215[Renderer]
158# Which backend API to use. 216# Which backend API to use.
159# 0 (default): OpenGL, 1: Vulkan 217# 0 (default): OpenGL, 1: Vulkan
@@ -166,14 +224,6 @@ debug =
166# Which Vulkan physical device to use (defaults to 0) 224# Which Vulkan physical device to use (defaults to 0)
167vulkan_device = 225vulkan_device =
168 226
169# Whether to use software or hardware rendering.
170# 0: Software, 1 (default): Hardware
171use_hw_renderer =
172
173# Whether to use the Just-In-Time (JIT) compiler for shader emulation
174# 0: Interpreter (slow), 1 (default): JIT (fast)
175use_shader_jit =
176
177# Aspect ratio 227# Aspect ratio
178# 0: Default (16:9), 1: Force 4:3, 2: Force 21:9, 3: Stretch to Window 228# 0: Default (16:9), 1: Force 4:3, 2: Force 21:9, 3: Stretch to Window
179aspect_ratio = 229aspect_ratio =
@@ -211,21 +261,20 @@ use_frame_limit =
211frame_limit = 261frame_limit =
212 262
213# Whether to use disk based shader cache 263# Whether to use disk based shader cache
214# 0 (default): Off, 1 : On 264# 0: Off, 1 (default): On
215use_disk_shader_cache = 265use_disk_shader_cache =
216 266
217# Which gpu accuracy level to use 267# Which gpu accuracy level to use
218# 0 (Normal), 1 (High), 2 (Extreme) 268# 0: Normal, 1 (default): High, 2: Extreme (Very slow)
219gpu_accuracy = 269gpu_accuracy =
220 270
221# Whether to use asynchronous GPU emulation 271# Whether to use asynchronous GPU emulation
222# 0 : Off (slow), 1 (default): On (fast) 272# 0 : Off (slow), 1 (default): On (fast)
223use_asynchronous_gpu_emulation = 273use_asynchronous_gpu_emulation =
224 274
225# Forces VSync on the display thread. Usually doesn't impact performance, but on some drivers it can 275# Inform the guest that GPU operations completed more quickly than they did.
226# so only turn this off if you notice a speed difference.
227# 0: Off, 1 (default): On 276# 0: Off, 1 (default): On
228use_vsync = 277use_fast_gpu_time =
229 278
230# Whether to use garbage collection or not for GPU caches. 279# Whether to use garbage collection or not for GPU caches.
231# 0 (default): Off, 1: On 280# 0 (default): Off, 1: On
@@ -237,31 +286,6 @@ bg_red =
237bg_blue = 286bg_blue =
238bg_green = 287bg_green =
239 288
240[Layout]
241# Layout for the screen inside the render window.
242# 0 (default): Default Top Bottom Screen, 1: Single Screen Only, 2: Large Screen Small Screen
243layout_option =
244
245# Toggle custom layout (using the settings below) on or off.
246# 0 (default): Off, 1: On
247custom_layout =
248
249# Screen placement when using Custom layout option
250# 0x, 0y is the top left corner of the render window.
251custom_top_left =
252custom_top_top =
253custom_top_right =
254custom_top_bottom =
255custom_bottom_left =
256custom_bottom_top =
257custom_bottom_right =
258custom_bottom_bottom =
259
260# Swaps the prominent screen with the other screen.
261# For example, if Single Screen is chosen, setting this to 1 will display the bottom screen instead of the top screen.
262# 0 (default): Top Screen is prominent, 1: Bottom Screen is prominent
263swap_screen =
264
265[Audio] 289[Audio]
266# Which audio output engine to use. 290# Which audio output engine to use.
267# auto (default): Auto-select 291# auto (default): Auto-select
@@ -308,10 +332,6 @@ gamecard_path =
308# 1 (default): Yes, 0: No 332# 1 (default): Yes, 0: No
309use_docked_mode = 333use_docked_mode =
310 334
311# Allow the use of NFC in games
312# 1 (default): Yes, 0 : No
313enable_nfc =
314
315# Sets the seed for the RNG generator built into the switch 335# Sets the seed for the RNG generator built into the switch
316# rng_seed will be ignored and randomly generated if rng_seed_enabled is false 336# rng_seed will be ignored and randomly generated if rng_seed_enabled is false
317rng_seed_enabled = 337rng_seed_enabled =
@@ -323,10 +343,6 @@ rng_seed =
323custom_rtc_enabled = 343custom_rtc_enabled =
324custom_rtc = 344custom_rtc =
325 345
326# Sets the account username, max length is 32 characters
327# yuzu (default)
328username = yuzu
329
330# Sets the systems language index 346# Sets the systems language index
331# 0: Japanese, 1: English (default), 2: French, 3: German, 4: Italian, 5: Spanish, 6: Chinese, 347# 0: Japanese, 1: English (default), 2: French, 3: German, 4: Italian, 5: Spanish, 6: Chinese,
332# 7: Korean, 8: Dutch, 9: Portuguese, 10: Russian, 11: Taiwanese, 12: British English, 13: Canadian French, 348# 7: Korean, 8: Dutch, 9: Portuguese, 10: Russian, 11: Taiwanese, 12: British English, 13: Canadian French,
@@ -335,17 +351,25 @@ language_index =
335 351
336# The system region that yuzu will use during emulation 352# The system region that yuzu will use during emulation
337# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan 353# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan
338region_value = 354region_index =
339 355
340# The system time zone that yuzu will use during emulation 356# The system time zone that yuzu will use during emulation
341# 0: Auto-select (default), 1: Default (system archive value), Others: Index for specified time zone 357# 0: Auto-select (default), 1: Default (system archive value), Others: Index for specified time zone
342time_zone_index = 358time_zone_index =
343 359
360# Sets the sound output mode.
361# 0: Mono, 1 (default): Stereo, 2: Surround
362sound_index =
363
344[Miscellaneous] 364[Miscellaneous]
345# A filter which removes logs below a certain logging level. 365# A filter which removes logs below a certain logging level.
346# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical 366# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical
347log_filter = *:Trace 367log_filter = *:Trace
348 368
369# Use developer keys
370# 0 (default): Disabled, 1: Enabled
371use_dev_keys =
372
349[Debugging] 373[Debugging]
350# Record frame time data, can be found in the log directory. Boolean value 374# Record frame time data, can be found in the log directory. Boolean value
351record_frame_times = 375record_frame_times =
@@ -355,6 +379,8 @@ dump_exefs=false
355dump_nso=false 379dump_nso=false
356# Determines whether or not yuzu will save the filesystem access log. 380# Determines whether or not yuzu will save the filesystem access log.
357enable_fs_access_log=false 381enable_fs_access_log=false
382# Enables verbose reporting services
383reporting_services =
358# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode 384# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode
359# false: Retail/Normal Mode (default), true: Kiosk Mode 385# false: Retail/Normal Mode (default), true: Kiosk Mode
360quest_flag = 386quest_flag =
@@ -393,4 +419,4 @@ title_ids =
393# For each title ID, have a key/value pair called `disabled_<title_id>` equal to the names of the add-ons to disable (sep. by '|') 419# For each title ID, have a key/value pair called `disabled_<title_id>` equal to the names of the add-ons to disable (sep. by '|')
394# e.x. disabled_0100000000010000 = Update|DLC <- disables Updates and DLC on Super Mario Odyssey 420# e.x. disabled_0100000000010000 = Update|DLC <- disables Updates and DLC on Super Mario Odyssey
395)"; 421)";
396} 422} // namespace DefaultINI