diff --git a/include/neural-graphics-primitives/testbed.h b/include/neural-graphics-primitives/testbed.h
index b52f00018da7f302a5330fad93f72bf5379d081e..7f69802641adde3c0473e39944e4a17519c5dd61 100644
--- a/include/neural-graphics-primitives/testbed.h
+++ b/include/neural-graphics-primitives/testbed.h
@@ -810,6 +810,8 @@ public:
 	std::chrono::time_point<std::chrono::steady_clock> m_training_start_time_point;
 	Eigen::Array4f m_background_color = {0.0f, 0.0f, 0.0f, 1.0f};
 
+	bool m_vsync = false;
+
 	// Visualization of neuron activations
 	int m_visualized_dimension = -1;
 	int m_visualized_layer = 0;
diff --git a/src/testbed.cu b/src/testbed.cu
index eb48fcf5c57246845d338fa1201ca2ac6d1e6212..c2664fa7f13a8c34c7e27d543e9706fddedc341c 100644
--- a/src/testbed.cu
+++ b/src/testbed.cu
@@ -649,6 +649,9 @@ void Testbed::imgui() {
 		}
 
 		ImGui::Checkbox("Dynamic resolution", &m_dynamic_res);
+		if (ImGui::Checkbox("VSync", &m_vsync)) {
+			glfwSwapInterval(m_vsync ? 1 : 0);
+		}
 		ImGui::SliderFloat("Target FPS", &m_dynamic_res_target_fps, 2.0f, 144.0f, "%.01f", ImGuiSliderFlags_Logarithmic | ImGuiSliderFlags_NoRoundToFormat);
 		ImGui::SliderInt("Max spp", &m_max_spp, 0, 1024, "%d", ImGuiSliderFlags_Logarithmic | ImGuiSliderFlags_NoRoundToFormat);