From 4cc9aa691db243e524a15aa347ab013d55178198 Mon Sep 17 00:00:00 2001 From: Kleidis Date: Sun, 7 Dec 2025 00:28:58 +0100 Subject: [android] Remove all frame skip / frame interpolation code (#3152) Both options do nothing, however one was exposed to the user making them think it actually helps. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3152 Reviewed-by: MaranBr Reviewed-by: Lizzie Reviewed-by: Caio Oliveira Co-authored-by: Kleidis Co-committed-by: Kleidis --- src/video_core/renderer_vulkan/renderer_vulkan.cpp | 138 --------------------- 1 file changed, 138 deletions(-) (limited to 'src/video_core/renderer_vulkan/renderer_vulkan.cpp') diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index e6e72cdca7..3b47570a7e 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -180,145 +180,7 @@ RendererVulkan::~RendererVulkan() { void(device.GetLogical().WaitIdle()); } -#ifdef __ANDROID__ -class BooleanSetting { - public: -// static BooleanSetting FRAME_SKIPPING; - static BooleanSetting FRAME_INTERPOLATION; - explicit BooleanSetting(bool initial_value = false) : value(initial_value) {} - - [[nodiscard]] bool getBoolean() const { - return value; - } - - void setBoolean(bool new_value) { - value = new_value; - } - - private: - bool value; - }; - - // Initialize static members -// BooleanSetting BooleanSetting::FRAME_SKIPPING(false); - BooleanSetting BooleanSetting::FRAME_INTERPOLATION(false); - -// extern "C" JNIEXPORT jboolean JNICALL -// Java_org_yuzu_yuzu_1emu_features_settings_model_BooleanSetting_isFrameSkippingEnabled(JNIEnv* env, jobject /* this */) { -// return static_cast(BooleanSetting::FRAME_SKIPPING.getBoolean()); -// } - - extern "C" JNIEXPORT jboolean JNICALL - Java_org_yuzu_yuzu_1emu_features_settings_model_BooleanSetting_isFrameInterpolationEnabled(JNIEnv* env, jobject /* this */) { - return static_cast(BooleanSetting::FRAME_INTERPOLATION.getBoolean()); - } - - void RendererVulkan::InterpolateFrames(Frame* prev_frame, Frame* interpolated_frame) { - if (!prev_frame || !interpolated_frame || !prev_frame->image || !interpolated_frame->image) { - return; - } - - const auto& framebuffer_layout = render_window.GetFramebufferLayout(); - // Fixed aggressive downscale (50%) - VkExtent2D dst_extent{ - .width = framebuffer_layout.width / 2, - .height = framebuffer_layout.height / 2 - }; - - // Check if we need to recreate the destination frame - bool needs_recreation = false; // Only recreate when necessary - if (!interpolated_frame->image_view) { - needs_recreation = true; // Need to create initially - } else { - // Check if dimensions have changed - if (interpolated_frame->framebuffer) { - needs_recreation = (framebuffer_layout.width / 2 != dst_extent.width) || - (framebuffer_layout.height / 2 != dst_extent.height); - } else { - needs_recreation = true; - } - } - - if (needs_recreation) { - interpolated_frame->image = CreateWrappedImage(memory_allocator, dst_extent, swapchain.GetImageViewFormat()); - interpolated_frame->image_view = CreateWrappedImageView(device, interpolated_frame->image, swapchain.GetImageViewFormat()); - interpolated_frame->framebuffer = blit_swapchain.CreateFramebuffer( - Layout::FramebufferLayout{dst_extent.width, dst_extent.height}, - *interpolated_frame->image_view, - swapchain.GetImageViewFormat()); - } - - scheduler.RequestOutsideRenderPassOperationContext(); - scheduler.Record([&](vk::CommandBuffer cmdbuf) { - // Transition images to transfer layouts - TransitionImageLayout(cmdbuf, *prev_frame->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); - TransitionImageLayout(cmdbuf, *interpolated_frame->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - - // Perform the downscale blit - VkImageBlit blit_region{}; - blit_region.srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; - blit_region.srcOffsets[0] = {0, 0, 0}; - blit_region.srcOffsets[1] = { - static_cast(framebuffer_layout.width), - static_cast(framebuffer_layout.height), - 1 - }; - blit_region.dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1}; - blit_region.dstOffsets[0] = {0, 0, 0}; - blit_region.dstOffsets[1] = { - static_cast(dst_extent.width), - static_cast(dst_extent.height), - 1 - }; - - // Using the wrapper's BlitImage with proper parameters - cmdbuf.BlitImage( - *prev_frame->image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - *interpolated_frame->image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - blit_region, VK_FILTER_NEAREST - ); - - // Transition back to general layout - TransitionImageLayout(cmdbuf, *prev_frame->image, VK_IMAGE_LAYOUT_GENERAL); - TransitionImageLayout(cmdbuf, *interpolated_frame->image, VK_IMAGE_LAYOUT_GENERAL); - }); - } -#endif - void RendererVulkan::Composite(std::span framebuffers) { - #ifdef __ANDROID__ - static int frame_counter = 0; - static int target_fps = 60; // Target FPS (30 or 60) - int frame_skip_threshold = 1; - - bool frame_skipping = false; //BooleanSetting::FRAME_SKIPPING.getBoolean(); - bool frame_interpolation = BooleanSetting::FRAME_INTERPOLATION.getBoolean(); - #endif - - if (framebuffers.empty()) { - return; - } - - #ifdef __ANDROID__ - if (frame_skipping) { - frame_skip_threshold = (target_fps == 30) ? 2 : 2; - } - - frame_counter++; - if (frame_counter % frame_skip_threshold != 0) { - if (frame_interpolation && previous_frame) { - Frame* interpolated_frame = present_manager.GetRenderFrame(); - InterpolateFrames(previous_frame, interpolated_frame); - blit_swapchain.DrawToFrame(rasterizer, interpolated_frame, framebuffers, - render_window.GetFramebufferLayout(), swapchain.GetImageCount(), - swapchain.GetImageViewFormat()); - scheduler.Flush(*interpolated_frame->render_ready); - present_manager.Present(interpolated_frame); - } - return; - } - #endif - SCOPE_EXIT { render_window.OnFrameDisplayed(); }; -- cgit v1.2.3