diff options
| author | 2020-07-10 14:00:02 +1000 | |
|---|---|---|
| committer | 2020-07-17 14:26:14 +1000 | |
| commit | 85d7a8f466837859a372fdc2a93028061e1b0bb8 (patch) | |
| tree | 1f924fffcd6f8a44eb54c6e4a8bc94b7773c88eb /src | |
| parent | async shaders (diff) | |
| download | yuzu-85d7a8f466837859a372fdc2a93028061e1b0bb8.tar.gz yuzu-85d7a8f466837859a372fdc2a93028061e1b0bb8.tar.xz yuzu-85d7a8f466837859a372fdc2a93028061e1b0bb8.zip | |
Rebase for per game settings
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/settings.cpp | 3 | ||||
| -rw-r--r-- | src/core/settings.h | 1 | ||||
| -rw-r--r-- | src/core/telemetry_session.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_device.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 6 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.cpp | 22 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_graphics_advanced.ui | 10 | ||||
| -rw-r--r-- | src/yuzu_cmd/config.cpp | 4 | ||||
| -rw-r--r-- | src/yuzu_cmd/default_ini.h | 4 |
9 files changed, 53 insertions, 1 deletions
diff --git a/src/core/settings.cpp b/src/core/settings.cpp index e8a6f2a6e..764df0db3 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp | |||
| @@ -115,6 +115,8 @@ void LogSettings() { | |||
| 115 | values.use_asynchronous_gpu_emulation.GetValue()); | 115 | values.use_asynchronous_gpu_emulation.GetValue()); |
| 116 | log_setting("Renderer_UseVsync", values.use_vsync.GetValue()); | 116 | log_setting("Renderer_UseVsync", values.use_vsync.GetValue()); |
| 117 | log_setting("Renderer_UseAssemblyShaders", values.use_assembly_shaders.GetValue()); | 117 | log_setting("Renderer_UseAssemblyShaders", values.use_assembly_shaders.GetValue()); |
| 118 | log_setting("Renderer_UseAsynchronousShaders", | ||
| 119 | Settings::values.use_asynchronous_shaders.GetValue()); | ||
| 118 | log_setting("Renderer_AnisotropicFilteringLevel", values.max_anisotropy.GetValue()); | 120 | log_setting("Renderer_AnisotropicFilteringLevel", values.max_anisotropy.GetValue()); |
| 119 | log_setting("Audio_OutputEngine", values.sink_id); | 121 | log_setting("Audio_OutputEngine", values.sink_id); |
| 120 | log_setting("Audio_EnableAudioStretching", values.enable_audio_stretching.GetValue()); | 122 | log_setting("Audio_EnableAudioStretching", values.enable_audio_stretching.GetValue()); |
| @@ -170,6 +172,7 @@ void RestoreGlobalState() { | |||
| 170 | values.use_asynchronous_gpu_emulation.SetGlobal(true); | 172 | values.use_asynchronous_gpu_emulation.SetGlobal(true); |
| 171 | values.use_vsync.SetGlobal(true); | 173 | values.use_vsync.SetGlobal(true); |
| 172 | values.use_assembly_shaders.SetGlobal(true); | 174 | values.use_assembly_shaders.SetGlobal(true); |
| 175 | values.use_asynchronous_shaders.SetGlobal(true); | ||
| 173 | values.use_fast_gpu_time.SetGlobal(true); | 176 | values.use_fast_gpu_time.SetGlobal(true); |
| 174 | values.force_30fps_mode.SetGlobal(true); | 177 | values.force_30fps_mode.SetGlobal(true); |
| 175 | values.bg_red.SetGlobal(true); | 178 | values.bg_red.SetGlobal(true); |
diff --git a/src/core/settings.h b/src/core/settings.h index a64debd25..386233fdf 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -434,6 +434,7 @@ struct Values { | |||
| 434 | Setting<bool> use_asynchronous_gpu_emulation; | 434 | Setting<bool> use_asynchronous_gpu_emulation; |
| 435 | Setting<bool> use_vsync; | 435 | Setting<bool> use_vsync; |
| 436 | Setting<bool> use_assembly_shaders; | 436 | Setting<bool> use_assembly_shaders; |
| 437 | Setting<bool> use_asynchronous_shaders; | ||
| 437 | Setting<bool> force_30fps_mode; | 438 | Setting<bool> force_30fps_mode; |
| 438 | Setting<bool> use_fast_gpu_time; | 439 | Setting<bool> use_fast_gpu_time; |
| 439 | 440 | ||
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index 78915e6db..5a30c75da 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp | |||
| @@ -207,6 +207,8 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { | |||
| 207 | AddField(field_type, "Renderer_UseVsync", Settings::values.use_vsync.GetValue()); | 207 | AddField(field_type, "Renderer_UseVsync", Settings::values.use_vsync.GetValue()); |
| 208 | AddField(field_type, "Renderer_UseAssemblyShaders", | 208 | AddField(field_type, "Renderer_UseAssemblyShaders", |
| 209 | Settings::values.use_assembly_shaders.GetValue()); | 209 | Settings::values.use_assembly_shaders.GetValue()); |
| 210 | AddField(field_type, "Renderer_UseAsynchronousShaders", | ||
| 211 | Settings::values.use_asynchronous_shaders.GetValue()); | ||
| 210 | AddField(field_type, "System_UseDockedMode", Settings::values.use_docked_mode); | 212 | AddField(field_type, "System_UseDockedMode", Settings::values.use_docked_mode); |
| 211 | } | 213 | } |
| 212 | 214 | ||
diff --git a/src/video_core/renderer_opengl/gl_device.cpp b/src/video_core/renderer_opengl/gl_device.cpp index 7c27eed6d..630acb73b 100644 --- a/src/video_core/renderer_opengl/gl_device.cpp +++ b/src/video_core/renderer_opengl/gl_device.cpp | |||
| @@ -233,7 +233,7 @@ Device::Device() | |||
| 233 | GLAD_GL_NV_gpu_program5 && GLAD_GL_NV_compute_program5 && | 233 | GLAD_GL_NV_gpu_program5 && GLAD_GL_NV_compute_program5 && |
| 234 | GLAD_GL_NV_transform_feedback && GLAD_GL_NV_transform_feedback2; | 234 | GLAD_GL_NV_transform_feedback && GLAD_GL_NV_transform_feedback2; |
| 235 | 235 | ||
| 236 | use_asynchronous_shaders = Settings::values.use_asynchronous_shaders; | 236 | use_asynchronous_shaders = Settings::values.use_asynchronous_shaders.GetValue(); |
| 237 | 237 | ||
| 238 | LOG_INFO(Render_OpenGL, "Renderer_VariableAOFFI: {}", has_variable_aoffi); | 238 | LOG_INFO(Render_OpenGL, "Renderer_VariableAOFFI: {}", has_variable_aoffi); |
| 239 | LOG_INFO(Render_OpenGL, "Renderer_ComponentIndexingBug: {}", has_component_indexing_bug); | 239 | LOG_INFO(Render_OpenGL, "Renderer_ComponentIndexingBug: {}", has_component_indexing_bug); |
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index d25b99a32..4fef60fb2 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp | |||
| @@ -661,6 +661,8 @@ void Config::ReadRendererValues() { | |||
| 661 | ReadSettingGlobal(Settings::values.use_vsync, QStringLiteral("use_vsync"), true); | 661 | ReadSettingGlobal(Settings::values.use_vsync, QStringLiteral("use_vsync"), true); |
| 662 | ReadSettingGlobal(Settings::values.use_assembly_shaders, QStringLiteral("use_assembly_shaders"), | 662 | ReadSettingGlobal(Settings::values.use_assembly_shaders, QStringLiteral("use_assembly_shaders"), |
| 663 | false); | 663 | false); |
| 664 | ReadSettingGlobal(Settings::values.use_asynchronous_shaders, | ||
| 665 | QStringLiteral("use_asynchronous_shaders"), false); | ||
| 664 | ReadSettingGlobal(Settings::values.use_fast_gpu_time, QStringLiteral("use_fast_gpu_time"), | 666 | ReadSettingGlobal(Settings::values.use_fast_gpu_time, QStringLiteral("use_fast_gpu_time"), |
| 665 | true); | 667 | true); |
| 666 | ReadSettingGlobal(Settings::values.force_30fps_mode, QStringLiteral("force_30fps_mode"), false); | 668 | ReadSettingGlobal(Settings::values.force_30fps_mode, QStringLiteral("force_30fps_mode"), false); |
| @@ -1145,6 +1147,10 @@ void Config::SaveRendererValues() { | |||
| 1145 | WriteSettingGlobal(QStringLiteral("use_vsync"), Settings::values.use_vsync, true); | 1147 | WriteSettingGlobal(QStringLiteral("use_vsync"), Settings::values.use_vsync, true); |
| 1146 | WriteSettingGlobal(QStringLiteral("use_assembly_shaders"), | 1148 | WriteSettingGlobal(QStringLiteral("use_assembly_shaders"), |
| 1147 | Settings::values.use_assembly_shaders, false); | 1149 | Settings::values.use_assembly_shaders, false); |
| 1150 | WriteSettingGlobal(QStringLiteral("use_asynchronous_shaders"), | ||
| 1151 | Settings::values.use_asynchronous_shaders, false); | ||
| 1152 | WriteSettingGlobal(QStringLiteral("use_asynchronous_shaders"), | ||
| 1153 | Settings::values.use_asynchronous_shaders, false); | ||
| 1148 | WriteSettingGlobal(QStringLiteral("use_fast_gpu_time"), Settings::values.use_fast_gpu_time, | 1154 | WriteSettingGlobal(QStringLiteral("use_fast_gpu_time"), Settings::values.use_fast_gpu_time, |
| 1149 | true); | 1155 | true); |
| 1150 | WriteSettingGlobal(QStringLiteral("force_30fps_mode"), Settings::values.force_30fps_mode, | 1156 | WriteSettingGlobal(QStringLiteral("force_30fps_mode"), Settings::values.force_30fps_mode, |
diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 7c0fa7ec5..ce30188cd 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp | |||
| @@ -24,6 +24,7 @@ void ConfigureGraphicsAdvanced::SetConfiguration() { | |||
| 24 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); | 24 | const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn(); |
| 25 | ui->use_vsync->setEnabled(runtime_lock); | 25 | ui->use_vsync->setEnabled(runtime_lock); |
| 26 | ui->use_assembly_shaders->setEnabled(runtime_lock); | 26 | ui->use_assembly_shaders->setEnabled(runtime_lock); |
| 27 | ui->use_asynchronous_shaders->setEnabled(runtime_lock); | ||
| 27 | ui->force_30fps_mode->setEnabled(runtime_lock); | 28 | ui->force_30fps_mode->setEnabled(runtime_lock); |
| 28 | ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); | 29 | ui->anisotropic_filtering_combobox->setEnabled(runtime_lock); |
| 29 | 30 | ||
| @@ -32,6 +33,8 @@ void ConfigureGraphicsAdvanced::SetConfiguration() { | |||
| 32 | static_cast<int>(Settings::values.gpu_accuracy.GetValue())); | 33 | static_cast<int>(Settings::values.gpu_accuracy.GetValue())); |
| 33 | ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue()); | 34 | ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue()); |
| 34 | ui->use_assembly_shaders->setChecked(Settings::values.use_assembly_shaders.GetValue()); | 35 | ui->use_assembly_shaders->setChecked(Settings::values.use_assembly_shaders.GetValue()); |
| 36 | ui->use_asynchronous_shaders->setChecked( | ||
| 37 | Settings::values.use_asynchronous_shaders.GetValue()); | ||
| 35 | ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue()); | 38 | ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue()); |
| 36 | ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode.GetValue()); | 39 | ui->force_30fps_mode->setChecked(Settings::values.force_30fps_mode.GetValue()); |
| 37 | ui->anisotropic_filtering_combobox->setCurrentIndex( | 40 | ui->anisotropic_filtering_combobox->setCurrentIndex( |
| @@ -41,6 +44,10 @@ void ConfigureGraphicsAdvanced::SetConfiguration() { | |||
| 41 | ConfigurationShared::SetPerGameSetting(ui->use_vsync, &Settings::values.use_vsync); | 44 | ConfigurationShared::SetPerGameSetting(ui->use_vsync, &Settings::values.use_vsync); |
| 42 | ConfigurationShared::SetPerGameSetting(ui->use_assembly_shaders, | 45 | ConfigurationShared::SetPerGameSetting(ui->use_assembly_shaders, |
| 43 | &Settings::values.use_assembly_shaders); | 46 | &Settings::values.use_assembly_shaders); |
| 47 | ConfigurationShared::SetPerGameSetting(ui->use_asynchronous_shaders, | ||
| 48 | &Settings::values.use_asynchronous_shaders); | ||
| 49 | ConfigurationShared::SetPerGameSetting(ui->use_asynchronous_shaders, | ||
| 50 | &Settings::values.use_asynchronous_shaders); | ||
| 44 | ConfigurationShared::SetPerGameSetting(ui->use_fast_gpu_time, | 51 | ConfigurationShared::SetPerGameSetting(ui->use_fast_gpu_time, |
| 45 | &Settings::values.use_fast_gpu_time); | 52 | &Settings::values.use_fast_gpu_time); |
| 46 | ConfigurationShared::SetPerGameSetting(ui->force_30fps_mode, | 53 | ConfigurationShared::SetPerGameSetting(ui->force_30fps_mode, |
| @@ -67,6 +74,14 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() { | |||
| 67 | if (Settings::values.use_assembly_shaders.UsingGlobal()) { | 74 | if (Settings::values.use_assembly_shaders.UsingGlobal()) { |
| 68 | Settings::values.use_assembly_shaders.SetValue(ui->use_assembly_shaders->isChecked()); | 75 | Settings::values.use_assembly_shaders.SetValue(ui->use_assembly_shaders->isChecked()); |
| 69 | } | 76 | } |
| 77 | if (Settings::values.use_asynchronous_shaders.UsingGlobal()) { | ||
| 78 | Settings::values.use_asynchronous_shaders.SetValue( | ||
| 79 | ui->use_asynchronous_shaders->isChecked()); | ||
| 80 | } | ||
| 81 | if (Settings::values.use_asynchronous_shaders.UsingGlobal()) { | ||
| 82 | Settings::values.use_asynchronous_shaders.SetValue( | ||
| 83 | ui->use_asynchronous_shaders->isChecked()); | ||
| 84 | } | ||
| 70 | if (Settings::values.use_fast_gpu_time.UsingGlobal()) { | 85 | if (Settings::values.use_fast_gpu_time.UsingGlobal()) { |
| 71 | Settings::values.use_fast_gpu_time.SetValue(ui->use_fast_gpu_time->isChecked()); | 86 | Settings::values.use_fast_gpu_time.SetValue(ui->use_fast_gpu_time->isChecked()); |
| 72 | } | 87 | } |
| @@ -83,6 +98,10 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() { | |||
| 83 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync); | 98 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync); |
| 84 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_assembly_shaders, | 99 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_assembly_shaders, |
| 85 | ui->use_assembly_shaders); | 100 | ui->use_assembly_shaders); |
| 101 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders, | ||
| 102 | ui->use_asynchronous_shaders); | ||
| 103 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders, | ||
| 104 | ui->use_asynchronous_shaders); | ||
| 86 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_fast_gpu_time, | 105 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_fast_gpu_time, |
| 87 | ui->use_fast_gpu_time); | 106 | ui->use_fast_gpu_time); |
| 88 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.force_30fps_mode, | 107 | ConfigurationShared::ApplyPerGameSetting(&Settings::values.force_30fps_mode, |
| @@ -117,6 +136,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() { | |||
| 117 | ui->gpu_accuracy->setEnabled(Settings::values.gpu_accuracy.UsingGlobal()); | 136 | ui->gpu_accuracy->setEnabled(Settings::values.gpu_accuracy.UsingGlobal()); |
| 118 | ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal()); | 137 | ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal()); |
| 119 | ui->use_assembly_shaders->setEnabled(Settings::values.use_assembly_shaders.UsingGlobal()); | 138 | ui->use_assembly_shaders->setEnabled(Settings::values.use_assembly_shaders.UsingGlobal()); |
| 139 | ui->use_asynchronous_shaders->setEnabled( | ||
| 140 | Settings::values.use_asynchronous_shaders.UsingGlobal()); | ||
| 120 | ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal()); | 141 | ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal()); |
| 121 | ui->force_30fps_mode->setEnabled(Settings::values.force_30fps_mode.UsingGlobal()); | 142 | ui->force_30fps_mode->setEnabled(Settings::values.force_30fps_mode.UsingGlobal()); |
| 122 | ui->anisotropic_filtering_combobox->setEnabled( | 143 | ui->anisotropic_filtering_combobox->setEnabled( |
| @@ -128,6 +149,7 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() { | |||
| 128 | ConfigurationShared::InsertGlobalItem(ui->gpu_accuracy); | 149 | ConfigurationShared::InsertGlobalItem(ui->gpu_accuracy); |
| 129 | ui->use_vsync->setTristate(true); | 150 | ui->use_vsync->setTristate(true); |
| 130 | ui->use_assembly_shaders->setTristate(true); | 151 | ui->use_assembly_shaders->setTristate(true); |
| 152 | ui->use_asynchronous_shaders->setTristate(true); | ||
| 131 | ui->use_fast_gpu_time->setTristate(true); | 153 | ui->use_fast_gpu_time->setTristate(true); |
| 132 | ui->force_30fps_mode->setTristate(true); | 154 | ui->force_30fps_mode->setTristate(true); |
| 133 | ConfigurationShared::InsertGlobalItem(ui->anisotropic_filtering_combobox); | 155 | ConfigurationShared::InsertGlobalItem(ui->anisotropic_filtering_combobox); |
diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index 0021607ac..71e7dfe5e 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui | |||
| @@ -73,6 +73,16 @@ | |||
| 73 | </widget> | 73 | </widget> |
| 74 | </item> | 74 | </item> |
| 75 | <item> | 75 | <item> |
| 76 | <widget class="QCheckBox" name="use_asynchronous_shaders"> | ||
| 77 | <property name="toolTip"> | ||
| 78 | <string>Enables asynchronous shader compilation, which may reduce shader stutter. This feature is experimental.</string> | ||
| 79 | </property> | ||
| 80 | <property name="text"> | ||
| 81 | <string>Use asynchronous shader building (experimental, OpenGL or Assembly shaders only)</string> | ||
| 82 | </property> | ||
| 83 | </widget> | ||
| 84 | </item> | ||
| 85 | <item> | ||
| 76 | <widget class="QCheckBox" name="force_30fps_mode"> | 86 | <widget class="QCheckBox" name="force_30fps_mode"> |
| 77 | <property name="text"> | 87 | <property name="text"> |
| 78 | <string>Force 30 FPS mode</string> | 88 | <string>Force 30 FPS mode</string> |
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index 7773228c8..c2a2982fb 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp | |||
| @@ -394,6 +394,10 @@ void Config::ReadValues() { | |||
| 394 | static_cast<u16>(sdl2_config->GetInteger("Renderer", "use_vsync", 1))); | 394 | static_cast<u16>(sdl2_config->GetInteger("Renderer", "use_vsync", 1))); |
| 395 | Settings::values.use_assembly_shaders.SetValue( | 395 | Settings::values.use_assembly_shaders.SetValue( |
| 396 | sdl2_config->GetBoolean("Renderer", "use_assembly_shaders", false)); | 396 | sdl2_config->GetBoolean("Renderer", "use_assembly_shaders", false)); |
| 397 | Settings::values.use_asynchronous_shaders.SetValue( | ||
| 398 | sdl2_config->GetBoolean("Renderer", "use_asynchronous_shaders", false)); | ||
| 399 | Settings::values.use_asynchronous_shaders.SetValue( | ||
| 400 | sdl2_config->GetBoolean("Renderer", "use_asynchronous_shaders", false)); | ||
| 397 | Settings::values.use_fast_gpu_time.SetValue( | 401 | Settings::values.use_fast_gpu_time.SetValue( |
| 398 | sdl2_config->GetBoolean("Renderer", "use_fast_gpu_time", true)); | 402 | sdl2_config->GetBoolean("Renderer", "use_fast_gpu_time", true)); |
| 399 | 403 | ||
diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index 5bed47fd7..aa9e40380 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h | |||
| @@ -166,6 +166,10 @@ use_vsync = | |||
| 166 | # 0 (default): Off, 1: On | 166 | # 0 (default): Off, 1: On |
| 167 | use_assembly_shaders = | 167 | use_assembly_shaders = |
| 168 | 168 | ||
| 169 | # Whether to allow asynchronous shader building. | ||
| 170 | # 0 (default): Off, 1: On | ||
| 171 | use_asynchronous_shaders = | ||
| 172 | |||
| 169 | # Turns on the frame limiter, which will limit frames output to the target game speed | 173 | # Turns on the frame limiter, which will limit frames output to the target game speed |
| 170 | # 0: Off, 1: On (default) | 174 | # 0: Off, 1: On (default) |
| 171 | use_frame_limit = | 175 | use_frame_limit = |