diff options
| -rw-r--r-- | CMakeLists.txt | 10 | ||||
| -rw-r--r-- | src/common/settings.h | 2 | ||||
| -rw-r--r-- | src/input_common/mouse/mouse_poller.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pass.cpp | 33 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 6 | ||||
| -rw-r--r-- | src/video_core/texture_cache/util.cpp | 86 | ||||
| -rw-r--r-- | src/yuzu/bootmanager.cpp | 9 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_audio.cpp | 12 | ||||
| -rw-r--r-- | src/yuzu_cmd/config.cpp | 24 | ||||
| -rw-r--r-- | src/yuzu_cmd/default_ini.h | 142 |
11 files changed, 190 insertions, 142 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 214d5a4a7..857550e71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
| @@ -254,7 +254,9 @@ if(ENABLE_QT) | |||
| 254 | 254 | ||
| 255 | # Check for system Qt on Linux, fallback to bundled Qt | 255 | # Check for system Qt on Linux, fallback to bundled Qt |
| 256 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") | 256 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") |
| 257 | find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets) | 257 | if (NOT YUZU_USE_BUNDLED_QT) |
| 258 | find_package(Qt5 ${QT_VERSION} COMPONENTS Widgets) | ||
| 259 | endif() | ||
| 258 | if (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT) | 260 | if (NOT Qt5_FOUND OR YUZU_USE_BUNDLED_QT) |
| 259 | # Check for dependencies, then enable bundled Qt download | 261 | # Check for dependencies, then enable bundled Qt download |
| 260 | 262 | ||
| @@ -337,6 +339,8 @@ if(ENABLE_QT) | |||
| 337 | endif() | 339 | endif() |
| 338 | endif() | 340 | endif() |
| 339 | 341 | ||
| 342 | set(YUZU_QT_NO_CMAKE_SYSTEM_PATH) | ||
| 343 | |||
| 340 | # Workaround for an issue where conan tries to build Qt from scratch instead of download prebuilt binaries | 344 | # Workaround for an issue where conan tries to build Qt from scratch instead of download prebuilt binaries |
| 341 | set(QT_PREFIX_HINT) | 345 | set(QT_PREFIX_HINT) |
| 342 | 346 | ||
| @@ -354,8 +358,10 @@ if(ENABLE_QT) | |||
| 354 | endif() | 358 | endif() |
| 355 | 359 | ||
| 356 | set(QT_PREFIX_HINT HINTS "${QT_PREFIX}") | 360 | set(QT_PREFIX_HINT HINTS "${QT_PREFIX}") |
| 361 | |||
| 362 | set(YUZU_QT_NO_CMAKE_SYSTEM_PATH "NO_CMAKE_SYSTEM_PATH") | ||
| 357 | endif() | 363 | endif() |
| 358 | find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets ${QT_PREFIX_HINT} NO_CMAKE_SYSTEM_PATH) | 364 | find_package(Qt5 ${QT_VERSION} REQUIRED COMPONENTS Widgets ${QT_PREFIX_HINT} ${YUZU_QT_NO_CMAKE_SYSTEM_PATH}) |
| 359 | if (YUZU_USE_QT_WEB_ENGINE) | 365 | if (YUZU_USE_QT_WEB_ENGINE) |
| 360 | find_package(Qt5 COMPONENTS WebEngineCore WebEngineWidgets) | 366 | find_package(Qt5 COMPONENTS WebEngineCore WebEngineWidgets) |
| 361 | endif() | 367 | endif() |
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 | ||
| 912 | void Image::DownloadMemory(const StagingBufferRef& map, std::span<const BufferImageCopy> copies) { | 915 | void 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 | ||
| 646 | u32 CalculateLayerSize(const ImageInfo& info) noexcept { | 626 | u32 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 | ||
| 652 | LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept { | 632 | LevelArray 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); |
| 1196 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); | 1176 | static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); |
| 1197 | 1177 | ||
| 1198 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 1, 0, 7) == | 1178 | static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 0, 7) == |
| 1199 | 0x2afc00); | 1179 | 0x2afc00); |
| 1200 | static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 1, | 1180 | static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 0, |
| 1201 | 0, 12) == 0x50d200); | 1181 | 12) == 0x50d200); |
| 1202 | 1182 | ||
| 1203 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1183 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 0) == |
| 1204 | 0) == 0); | 1184 | 0); |
| 1205 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1185 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 1) == |
| 1206 | 1) == 0x400000); | 1186 | 0x400000); |
| 1207 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1187 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 2) == |
| 1208 | 2) == 0x500000); | 1188 | 0x500000); |
| 1209 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1189 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 3) == |
| 1210 | 3) == 0x540000); | 1190 | 0x540000); |
| 1211 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1191 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 4) == |
| 1212 | 4) == 0x550000); | 1192 | 0x550000); |
| 1213 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1193 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 5) == |
| 1214 | 5) == 0x554000); | 1194 | 0x554000); |
| 1215 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1195 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 6) == |
| 1216 | 6) == 0x555000); | 1196 | 0x555000); |
| 1217 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1197 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 7) == |
| 1218 | 7) == 0x555400); | 1198 | 0x555400); |
| 1219 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1199 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 8) == |
| 1220 | 8) == 0x555600); | 1200 | 0x555600); |
| 1221 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | 1201 | static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 0, 9) == |
| 1222 | 9) == 0x555800); | 1202 | 0x555800); |
| 1223 | 1203 | ||
| 1224 | constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height, | 1204 | constexpr 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= | |||
| 65 | lstick= | 65 | lstick= |
| 66 | rstick= | 66 | rstick= |
| 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 | ||
| 73 | debug_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 |
| 70 | vibration_enabled= | 77 | vibration_enabled= |
| @@ -73,6 +80,10 @@ vibration_enabled= | |||
| 73 | # 0 (default): Disabled, 1: Enabled | 80 | # 0 (default): Disabled, 1: Enabled |
| 74 | enable_accurate_vibrations= | 81 | enable_accurate_vibrations= |
| 75 | 82 | ||
| 83 | # Enables controller motion inputs | ||
| 84 | # 0: Disabled, 1 (default): Enabled | ||
| 85 | motion_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. | 115 | udp_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. |
| 107 | udp_input_address=127.0.0.1 | 118 | # 0 (default): Off, 1: On |
| 119 | mouse_panning = | ||
| 120 | |||
| 121 | # Set mouse sensitivity. | ||
| 122 | # Default: 1.0 | ||
| 123 | mouse_panning_sensitivity = | ||
| 124 | |||
| 125 | # Emulate an analog control stick from keyboard inputs. | ||
| 126 | # 0 (default): Disabled, 1: Enabled | ||
| 127 | emulate_analog_keyboard = | ||
| 108 | 128 | ||
| 109 | # Port of the udp input server. (Default 26760) | 129 | # Enable mouse inputs to the guest |
| 110 | udp_input_port= | 130 | # 0 (default): Disabled, 1: Enabled |
| 131 | mouse_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 |
| 113 | udp_pad_index= | 134 | # 0 (default): Disabled, 1: Enabled |
| 135 | keyboard_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= | |||
| 118 | use_multi_core= | 140 | use_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 | ||
| 148 | cpu_accuracy = | ||
| 149 | |||
| 150 | # Allow disabling safe optimizations. | ||
| 151 | # 0 (default): Disabled, 1: Enabled | ||
| 152 | cpu_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 |
| 123 | cpuopt_page_tables = | 156 | cpuopt_page_tables = |
| @@ -154,6 +187,31 @@ cpuopt_reduce_misalign_checks = | |||
| 154 | # 0: Disabled, 1 (default): Enabled | 187 | # 0: Disabled, 1 (default): Enabled |
| 155 | cpuopt_fastmem = | 188 | cpuopt_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 | ||
| 193 | cpuopt_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 | ||
| 198 | cpuopt_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 | ||
| 203 | cpuopt_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 | ||
| 208 | cpuopt_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 | ||
| 213 | cpuopt_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) |
| 167 | vulkan_device = | 225 | vulkan_device = |
| 168 | 226 | ||
| 169 | # Whether to use software or hardware rendering. | ||
| 170 | # 0: Software, 1 (default): Hardware | ||
| 171 | use_hw_renderer = | ||
| 172 | |||
| 173 | # Whether to use the Just-In-Time (JIT) compiler for shader emulation | ||
| 174 | # 0: Interpreter (slow), 1 (default): JIT (fast) | ||
| 175 | use_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 |
| 179 | aspect_ratio = | 229 | aspect_ratio = |
| @@ -211,21 +261,20 @@ use_frame_limit = | |||
| 211 | frame_limit = | 261 | frame_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 |
| 215 | use_disk_shader_cache = | 265 | use_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) |
| 219 | gpu_accuracy = | 269 | gpu_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) |
| 223 | use_asynchronous_gpu_emulation = | 273 | use_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 |
| 228 | use_vsync = | 277 | use_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 = | |||
| 237 | bg_blue = | 286 | bg_blue = |
| 238 | bg_green = | 287 | bg_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 | ||
| 243 | layout_option = | ||
| 244 | |||
| 245 | # Toggle custom layout (using the settings below) on or off. | ||
| 246 | # 0 (default): Off, 1: On | ||
| 247 | custom_layout = | ||
| 248 | |||
| 249 | # Screen placement when using Custom layout option | ||
| 250 | # 0x, 0y is the top left corner of the render window. | ||
| 251 | custom_top_left = | ||
| 252 | custom_top_top = | ||
| 253 | custom_top_right = | ||
| 254 | custom_top_bottom = | ||
| 255 | custom_bottom_left = | ||
| 256 | custom_bottom_top = | ||
| 257 | custom_bottom_right = | ||
| 258 | custom_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 | ||
| 263 | swap_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 |
| 309 | use_docked_mode = | 333 | use_docked_mode = |
| 310 | 334 | ||
| 311 | # Allow the use of NFC in games | ||
| 312 | # 1 (default): Yes, 0 : No | ||
| 313 | enable_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 |
| 317 | rng_seed_enabled = | 337 | rng_seed_enabled = |
| @@ -323,10 +343,6 @@ rng_seed = | |||
| 323 | custom_rtc_enabled = | 343 | custom_rtc_enabled = |
| 324 | custom_rtc = | 344 | custom_rtc = |
| 325 | 345 | ||
| 326 | # Sets the account username, max length is 32 characters | ||
| 327 | # yuzu (default) | ||
| 328 | username = 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 |
| 338 | region_value = | 354 | region_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 |
| 342 | time_zone_index = | 358 | time_zone_index = |
| 343 | 359 | ||
| 360 | # Sets the sound output mode. | ||
| 361 | # 0: Mono, 1 (default): Stereo, 2: Surround | ||
| 362 | sound_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 |
| 347 | log_filter = *:Trace | 367 | log_filter = *:Trace |
| 348 | 368 | ||
| 369 | # Use developer keys | ||
| 370 | # 0 (default): Disabled, 1: Enabled | ||
| 371 | use_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 |
| 351 | record_frame_times = | 375 | record_frame_times = |
| @@ -355,6 +379,8 @@ dump_exefs=false | |||
| 355 | dump_nso=false | 379 | dump_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. |
| 357 | enable_fs_access_log=false | 381 | enable_fs_access_log=false |
| 382 | # Enables verbose reporting services | ||
| 383 | reporting_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 |
| 360 | quest_flag = | 386 | quest_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 |