summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/settings.cpp2
-rw-r--r--src/common/settings.h1
-rw-r--r--src/video_core/renderer_opengl/gl_texture_cache.cpp17
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp7
-rw-r--r--src/video_core/texture_cache/texture_cache.h1
-rw-r--r--src/video_core/textures/astc.cpp4
-rw-r--r--src/yuzu/configuration/config.cpp2
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.cpp7
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.h1
-rw-r--r--src/yuzu/configuration/configure_graphics_advanced.ui10
-rw-r--r--src/yuzu_cmd/config.cpp1
-rw-r--r--src/yuzu_cmd/default_ini.h4
12 files changed, 49 insertions, 8 deletions
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index 49b41c158..70b02146b 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -59,6 +59,7 @@ void LogSettings() {
59 values.use_asynchronous_gpu_emulation.GetValue()); 59 values.use_asynchronous_gpu_emulation.GetValue());
60 log_setting("Renderer_NvdecEmulation", values.nvdec_emulation.GetValue()); 60 log_setting("Renderer_NvdecEmulation", values.nvdec_emulation.GetValue());
61 log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue()); 61 log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue());
62 log_setting("Renderer_AsyncASTC", values.async_astc.GetValue());
62 log_setting("Renderer_UseVsync", values.use_vsync.GetValue()); 63 log_setting("Renderer_UseVsync", values.use_vsync.GetValue());
63 log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue()); 64 log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue());
64 log_setting("Renderer_UseAsynchronousShaders", values.use_asynchronous_shaders.GetValue()); 65 log_setting("Renderer_UseAsynchronousShaders", values.use_asynchronous_shaders.GetValue());
@@ -212,6 +213,7 @@ void RestoreGlobalState(bool is_powered_on) {
212 values.use_asynchronous_gpu_emulation.SetGlobal(true); 213 values.use_asynchronous_gpu_emulation.SetGlobal(true);
213 values.nvdec_emulation.SetGlobal(true); 214 values.nvdec_emulation.SetGlobal(true);
214 values.accelerate_astc.SetGlobal(true); 215 values.accelerate_astc.SetGlobal(true);
216 values.async_astc.SetGlobal(true);
215 values.use_vsync.SetGlobal(true); 217 values.use_vsync.SetGlobal(true);
216 values.shader_backend.SetGlobal(true); 218 values.shader_backend.SetGlobal(true);
217 values.use_asynchronous_shaders.SetGlobal(true); 219 values.use_asynchronous_shaders.SetGlobal(true);
diff --git a/src/common/settings.h b/src/common/settings.h
index 6d27dd5ee..512ecff69 100644
--- a/src/common/settings.h
+++ b/src/common/settings.h
@@ -453,6 +453,7 @@ struct Values {
453 SwitchableSetting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"}; 453 SwitchableSetting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"};
454 SwitchableSetting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"}; 454 SwitchableSetting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"};
455 SwitchableSetting<bool> accelerate_astc{true, "accelerate_astc"}; 455 SwitchableSetting<bool> accelerate_astc{true, "accelerate_astc"};
456 SwitchableSetting<bool> async_astc{false, "async_astc"};
456 SwitchableSetting<bool> use_vsync{true, "use_vsync"}; 457 SwitchableSetting<bool> use_vsync{true, "use_vsync"};
457 SwitchableSetting<ShaderBackend, true> shader_backend{ShaderBackend::GLSL, ShaderBackend::GLSL, 458 SwitchableSetting<ShaderBackend, true> shader_backend{ShaderBackend::GLSL, ShaderBackend::GLSL,
458 ShaderBackend::SPIRV, "shader_backend"}; 459 ShaderBackend::SPIRV, "shader_backend"};
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp
index eb6e43a08..b047e7b3d 100644
--- a/src/video_core/renderer_opengl/gl_texture_cache.cpp
+++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp
@@ -228,8 +228,9 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
228 228
229[[nodiscard]] bool CanBeAccelerated(const TextureCacheRuntime& runtime, 229[[nodiscard]] bool CanBeAccelerated(const TextureCacheRuntime& runtime,
230 const VideoCommon::ImageInfo& info) { 230 const VideoCommon::ImageInfo& info) {
231 if (IsPixelFormatASTC(info.format)) { 231 if (IsPixelFormatASTC(info.format) && !runtime.HasNativeASTC()) {
232 return !runtime.HasNativeASTC() && Settings::values.accelerate_astc.GetValue(); 232 return Settings::values.accelerate_astc.GetValue() &&
233 !Settings::values.async_astc.GetValue();
233 } 234 }
234 // Disable other accelerated uploads for now as they don't implement swizzled uploads 235 // Disable other accelerated uploads for now as they don't implement swizzled uploads
235 return false; 236 return false;
@@ -258,6 +259,14 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
258 return format_info.compatibility_class == store_class; 259 return format_info.compatibility_class == store_class;
259} 260}
260 261
262[[nodiscard]] bool CanBeDecodedAsync(const TextureCacheRuntime& runtime,
263 const VideoCommon::ImageInfo& info) {
264 if (IsPixelFormatASTC(info.format) && !runtime.HasNativeASTC()) {
265 return Settings::values.async_astc.GetValue();
266 }
267 return false;
268}
269
261[[nodiscard]] CopyOrigin MakeCopyOrigin(VideoCommon::Offset3D offset, 270[[nodiscard]] CopyOrigin MakeCopyOrigin(VideoCommon::Offset3D offset,
262 VideoCommon::SubresourceLayers subresource, GLenum target) { 271 VideoCommon::SubresourceLayers subresource, GLenum target) {
263 switch (target) { 272 switch (target) {
@@ -721,7 +730,9 @@ std::optional<size_t> TextureCacheRuntime::StagingBuffers::FindBuffer(size_t req
721Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_, GPUVAddr gpu_addr_, 730Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_, GPUVAddr gpu_addr_,
722 VAddr cpu_addr_) 731 VAddr cpu_addr_)
723 : VideoCommon::ImageBase(info_, gpu_addr_, cpu_addr_), runtime{&runtime_} { 732 : VideoCommon::ImageBase(info_, gpu_addr_, cpu_addr_), runtime{&runtime_} {
724 if (CanBeAccelerated(*runtime, info)) { 733 if (CanBeDecodedAsync(*runtime, info)) {
734 flags |= ImageFlagBits::AsynchronousDecode;
735 } else if (CanBeAccelerated(*runtime, info)) {
725 flags |= ImageFlagBits::AcceleratedUpload; 736 flags |= ImageFlagBits::AcceleratedUpload;
726 } 737 }
727 if (IsConverted(runtime->device, info.format, info.type)) { 738 if (IsConverted(runtime->device, info.format, info.type)) {
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 9b85dfb5e..80adb70eb 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1256,11 +1256,12 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu
1256 commit(runtime_.memory_allocator.Commit(original_image, MemoryUsage::DeviceLocal)), 1256 commit(runtime_.memory_allocator.Commit(original_image, MemoryUsage::DeviceLocal)),
1257 aspect_mask(ImageAspectMask(info.format)) { 1257 aspect_mask(ImageAspectMask(info.format)) {
1258 if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) { 1258 if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) {
1259 if (Settings::values.accelerate_astc.GetValue()) { 1259 if (Settings::values.async_astc.GetValue()) {
1260 flags |= VideoCommon::ImageFlagBits::AsynchronousDecode;
1261 } else if (Settings::values.accelerate_astc.GetValue()) {
1260 flags |= VideoCommon::ImageFlagBits::AcceleratedUpload; 1262 flags |= VideoCommon::ImageFlagBits::AcceleratedUpload;
1261 } else {
1262 flags |= VideoCommon::ImageFlagBits::Converted;
1263 } 1263 }
1264 flags |= VideoCommon::ImageFlagBits::Converted;
1264 flags |= VideoCommon::ImageFlagBits::CostlyLoad; 1265 flags |= VideoCommon::ImageFlagBits::CostlyLoad;
1265 } 1266 }
1266 if (runtime->device.HasDebuggingToolAttached()) { 1267 if (runtime->device.HasDebuggingToolAttached()) {
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 4159bc796..9dd152fbe 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -1003,6 +1003,7 @@ u64 TextureCache<P>::GetScaledImageSizeBytes(const ImageBase& image) {
1003template <class P> 1003template <class P>
1004void TextureCache<P>::QueueAsyncDecode(Image& image, ImageId image_id) { 1004void TextureCache<P>::QueueAsyncDecode(Image& image, ImageId image_id) {
1005 UNIMPLEMENTED_IF(False(image.flags & ImageFlagBits::Converted)); 1005 UNIMPLEMENTED_IF(False(image.flags & ImageFlagBits::Converted));
1006 LOG_INFO(HW_GPU, "Queuing async texture decode");
1006 1007
1007 image.flags |= ImageFlagBits::IsDecoding; 1008 image.flags |= ImageFlagBits::IsDecoding;
1008 auto decode = std::make_unique<AsyncDecodeContext>(); 1009 auto decode = std::make_unique<AsyncDecodeContext>();
diff --git a/src/video_core/textures/astc.cpp b/src/video_core/textures/astc.cpp
index e8d7c7863..4381eed1d 100644
--- a/src/video_core/textures/astc.cpp
+++ b/src/video_core/textures/astc.cpp
@@ -1656,8 +1656,8 @@ void Decompress(std::span<const uint8_t> data, uint32_t width, uint32_t height,
1656 const u32 rows = Common::DivideUp(height, block_height); 1656 const u32 rows = Common::DivideUp(height, block_height);
1657 const u32 cols = Common::DivideUp(width, block_width); 1657 const u32 cols = Common::DivideUp(width, block_width);
1658 1658
1659 Common::ThreadWorker workers{std::max(std::thread::hardware_concurrency(), 2U) / 2, 1659 static Common::ThreadWorker workers{std::max(std::thread::hardware_concurrency(), 2U) / 2,
1660 "ASTCDecompress"}; 1660 "ASTCDecompress"};
1661 1661
1662 for (u32 z = 0; z < depth; ++z) { 1662 for (u32 z = 0; z < depth; ++z) {
1663 const u32 depth_offset = z * height * width * 4; 1663 const u32 depth_offset = z * height * width * 4;
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index db68ed259..dd1c1e94a 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -707,6 +707,7 @@ void Config::ReadRendererValues() {
707 ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation); 707 ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
708 ReadGlobalSetting(Settings::values.nvdec_emulation); 708 ReadGlobalSetting(Settings::values.nvdec_emulation);
709 ReadGlobalSetting(Settings::values.accelerate_astc); 709 ReadGlobalSetting(Settings::values.accelerate_astc);
710 ReadGlobalSetting(Settings::values.async_astc);
710 ReadGlobalSetting(Settings::values.use_vsync); 711 ReadGlobalSetting(Settings::values.use_vsync);
711 ReadGlobalSetting(Settings::values.shader_backend); 712 ReadGlobalSetting(Settings::values.shader_backend);
712 ReadGlobalSetting(Settings::values.use_asynchronous_shaders); 713 ReadGlobalSetting(Settings::values.use_asynchronous_shaders);
@@ -1350,6 +1351,7 @@ void Config::SaveRendererValues() {
1350 static_cast<u32>(Settings::values.nvdec_emulation.GetDefault()), 1351 static_cast<u32>(Settings::values.nvdec_emulation.GetDefault()),
1351 Settings::values.nvdec_emulation.UsingGlobal()); 1352 Settings::values.nvdec_emulation.UsingGlobal());
1352 WriteGlobalSetting(Settings::values.accelerate_astc); 1353 WriteGlobalSetting(Settings::values.accelerate_astc);
1354 WriteGlobalSetting(Settings::values.async_astc);
1353 WriteGlobalSetting(Settings::values.use_vsync); 1355 WriteGlobalSetting(Settings::values.use_vsync);
1354 WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()), 1356 WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()),
1355 static_cast<u32>(Settings::values.shader_backend.GetValue(global)), 1357 static_cast<u32>(Settings::values.shader_backend.GetValue(global)),
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp
index cc0155a2c..bbc363322 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.cpp
+++ b/src/yuzu/configuration/configure_graphics_advanced.cpp
@@ -23,11 +23,13 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
23 const bool runtime_lock = !system.IsPoweredOn(); 23 const bool runtime_lock = !system.IsPoweredOn();
24 ui->use_vsync->setEnabled(runtime_lock); 24 ui->use_vsync->setEnabled(runtime_lock);
25 ui->renderer_force_max_clock->setEnabled(runtime_lock); 25 ui->renderer_force_max_clock->setEnabled(runtime_lock);
26 ui->async_astc->setEnabled(runtime_lock);
26 ui->use_asynchronous_shaders->setEnabled(runtime_lock); 27 ui->use_asynchronous_shaders->setEnabled(runtime_lock);
27 ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); 28 ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);
28 29
29 ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue()); 30 ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue());
30 ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue()); 31 ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue());
32 ui->async_astc->setChecked(Settings::values.async_astc.GetValue());
31 ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue()); 33 ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue());
32 ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue()); 34 ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue());
33 ui->use_pessimistic_flushes->setChecked(Settings::values.use_pessimistic_flushes.GetValue()); 35 ui->use_pessimistic_flushes->setChecked(Settings::values.use_pessimistic_flushes.GetValue());
@@ -60,6 +62,8 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {
60 ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy, 62 ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,
61 ui->anisotropic_filtering_combobox); 63 ui->anisotropic_filtering_combobox);
62 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync); 64 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync);
65 ConfigurationShared::ApplyPerGameSetting(&Settings::values.async_astc, ui->async_astc,
66 async_astc);
63 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders, 67 ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders,
64 ui->use_asynchronous_shaders, 68 ui->use_asynchronous_shaders,
65 use_asynchronous_shaders); 69 use_asynchronous_shaders);
@@ -91,6 +95,7 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
91 ui->renderer_force_max_clock->setEnabled( 95 ui->renderer_force_max_clock->setEnabled(
92 Settings::values.renderer_force_max_clock.UsingGlobal()); 96 Settings::values.renderer_force_max_clock.UsingGlobal());
93 ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal()); 97 ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal());
98 ui->async_astc->setEnabled(Settings::values.async_astc.UsingGlobal());
94 ui->use_asynchronous_shaders->setEnabled( 99 ui->use_asynchronous_shaders->setEnabled(
95 Settings::values.use_asynchronous_shaders.UsingGlobal()); 100 Settings::values.use_asynchronous_shaders.UsingGlobal());
96 ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal()); 101 ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal());
@@ -108,6 +113,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
108 Settings::values.renderer_force_max_clock, 113 Settings::values.renderer_force_max_clock,
109 renderer_force_max_clock); 114 renderer_force_max_clock);
110 ConfigurationShared::SetColoredTristate(ui->use_vsync, Settings::values.use_vsync, use_vsync); 115 ConfigurationShared::SetColoredTristate(ui->use_vsync, Settings::values.use_vsync, use_vsync);
116 ConfigurationShared::SetColoredTristate(ui->async_astc, Settings::values.async_astc,
117 async_astc);
111 ConfigurationShared::SetColoredTristate(ui->use_asynchronous_shaders, 118 ConfigurationShared::SetColoredTristate(ui->use_asynchronous_shaders,
112 Settings::values.use_asynchronous_shaders, 119 Settings::values.use_asynchronous_shaders,
113 use_asynchronous_shaders); 120 use_asynchronous_shaders);
diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h
index df557d585..bf1b04749 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.h
+++ b/src/yuzu/configuration/configure_graphics_advanced.h
@@ -38,6 +38,7 @@ private:
38 38
39 ConfigurationShared::CheckState renderer_force_max_clock; 39 ConfigurationShared::CheckState renderer_force_max_clock;
40 ConfigurationShared::CheckState use_vsync; 40 ConfigurationShared::CheckState use_vsync;
41 ConfigurationShared::CheckState async_astc;
41 ConfigurationShared::CheckState use_asynchronous_shaders; 42 ConfigurationShared::CheckState use_asynchronous_shaders;
42 ConfigurationShared::CheckState use_fast_gpu_time; 43 ConfigurationShared::CheckState use_fast_gpu_time;
43 ConfigurationShared::CheckState use_pessimistic_flushes; 44 ConfigurationShared::CheckState use_pessimistic_flushes;
diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui
index 061885e30..a7dbdc18c 100644
--- a/src/yuzu/configuration/configure_graphics_advanced.ui
+++ b/src/yuzu/configuration/configure_graphics_advanced.ui
@@ -90,6 +90,16 @@
90 </widget> 90 </widget>
91 </item> 91 </item>
92 <item> 92 <item>
93 <widget class="QCheckBox" name="async_astc">
94 <property name="toolTip">
95 <string>Enables asynchronous ASTC texture decoding, which may reduce load time stutter. This feature is experimental.</string>
96 </property>
97 <property name="text">
98 <string>Decode ASTC textures asynchronously (Hack)</string>
99 </property>
100 </widget>
101 </item>
102 <item>
93 <widget class="QCheckBox" name="use_asynchronous_shaders"> 103 <widget class="QCheckBox" name="use_asynchronous_shaders">
94 <property name="toolTip"> 104 <property name="toolTip">
95 <string>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</string> 105 <string>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</string>
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 3b6dce296..464da3231 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -324,6 +324,7 @@ void Config::ReadValues() {
324 ReadSetting("Renderer", Settings::values.use_asynchronous_shaders); 324 ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
325 ReadSetting("Renderer", Settings::values.nvdec_emulation); 325 ReadSetting("Renderer", Settings::values.nvdec_emulation);
326 ReadSetting("Renderer", Settings::values.accelerate_astc); 326 ReadSetting("Renderer", Settings::values.accelerate_astc);
327 ReadSetting("Renderer", Settings::values.async_astc);
327 ReadSetting("Renderer", Settings::values.use_fast_gpu_time); 328 ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
328 ReadSetting("Renderer", Settings::values.use_pessimistic_flushes); 329 ReadSetting("Renderer", Settings::values.use_pessimistic_flushes);
329 ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache); 330 ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h
index cf3cc4c4e..20e403400 100644
--- a/src/yuzu_cmd/default_ini.h
+++ b/src/yuzu_cmd/default_ini.h
@@ -342,6 +342,10 @@ nvdec_emulation =
342# 0: Off, 1 (default): On 342# 0: Off, 1 (default): On
343accelerate_astc = 343accelerate_astc =
344 344
345# Decode ASTC textures asynchronously.
346# 0 (default): Off, 1: On
347async_astc =
348
345# Turns on the speed limiter, which will limit the emulation speed to the desired speed limit value 349# Turns on the speed limiter, which will limit the emulation speed to the desired speed limit value
346# 0: Off, 1: On (default) 350# 0: Off, 1: On (default)
347use_speed_limit = 351use_speed_limit =