diff --git a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp index 1593ca760a..aa6712decb 100644 --- a/rpcs3/Emu/Cell/lv2/sys_rsx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_rsx.cpp @@ -251,13 +251,12 @@ error_code sys_rsx_context_attribute(s32 context_id, u32 package_id, u64 a3, u64 //hle protection if (render->isHLE) - return 0; + return CELL_OK; auto m_sysrsx = fxm::get(); if (!m_sysrsx) { - sys_rsx.error("sys_rsx_context_attribute called before sys_rsx_context_allocate: context_id=0x%x, package_id=0x%x, a3=0x%llx, a4=0x%llx, a5=0x%llx, a6=0x%llx)", context_id, package_id, a3, a4, a5, a6); return CELL_EINVAL; } diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index 9263f77d78..f5aece8173 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -524,7 +524,7 @@ bool is_flip_surface_in_global_memory(rsx::surface_target color_target) } } -void D3D12GSRender::flip(int buffer) +void D3D12GSRender::flip(int buffer, bool emu_flip) { ID3D12Resource *resource_to_flip; float viewport_w, viewport_h; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 5d2f3a08cb..4c2f93f3bf 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -177,7 +177,7 @@ protected: virtual void do_local_task(rsx::FIFO_state state) override; virtual bool do_method(u32 cmd, u32 arg) override; virtual void end() override; - virtual void flip(int buffer) override; + virtual void flip(int buffer, bool emu_flip = false) override; virtual bool on_access_violation(u32 address, bool is_writing) override; diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index b0304a0d17..38469d27b4 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1564,7 +1564,7 @@ void GLGSRender::update_draw_state() m_begin_time += (u32)std::chrono::duration_cast(now - then).count(); } -void GLGSRender::flip(int buffer) +void GLGSRender::flip(int buffer, bool emu_flip) { if (skip_frame) { @@ -1789,7 +1789,7 @@ void GLGSRender::flip(int buffer) } m_frame->flip(m_context); - rsx::thread::flip(buffer); + rsx::thread::flip(buffer, emu_flip); // Cleanup m_gl_texture_cache.on_frame_end(); @@ -1910,7 +1910,7 @@ void GLGSRender::do_local_task(rsx::FIFO_state state) { if (!in_begin_end && async_flip_requested & flip_request::native_ui) { - flip((s32)current_display_buffer); + flip((s32)current_display_buffer, false); } } } diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.h b/rpcs3/Emu/RSX/GL/GLGSRender.h index 44d8ac1edc..2917597c04 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.h +++ b/rpcs3/Emu/RSX/GL/GLGSRender.h @@ -393,7 +393,7 @@ protected: void on_init_thread() override; void on_exit() override; bool do_method(u32 id, u32 arg) override; - void flip(int buffer) override; + void flip(int buffer, bool emu_flip = false) override; void do_local_task(rsx::FIFO_state state) override; diff --git a/rpcs3/Emu/RSX/GSRender.cpp b/rpcs3/Emu/RSX/GSRender.cpp index 143cdeb4c4..0fdbd297c8 100644 --- a/rpcs3/Emu/RSX/GSRender.cpp +++ b/rpcs3/Emu/RSX/GSRender.cpp @@ -50,7 +50,7 @@ void GSRender::on_exit() rsx::thread::on_exit(); } -void GSRender::flip(int buffer) +void GSRender::flip(int buffer, bool emu_flip) { if (m_frame) { diff --git a/rpcs3/Emu/RSX/GSRender.h b/rpcs3/Emu/RSX/GSRender.h index 82d40377f4..f4c34a0787 100644 --- a/rpcs3/Emu/RSX/GSRender.h +++ b/rpcs3/Emu/RSX/GSRender.h @@ -172,7 +172,7 @@ public: void on_init_thread() override; void on_exit() override; - void flip(int buffer) override; + void flip(int buffer, bool emu_flip = false) override; GSFrameBase* get_frame() { return m_frame; }; }; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 2f3948f6e7..fde8123967 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2094,7 +2094,7 @@ namespace rsx } } - void thread::flip(int buffer) + void thread::flip(int buffer, bool emu_flip) { if (!(async_flip_requested & flip_request::any)) { @@ -2135,7 +2135,14 @@ namespace rsx m_flattener.force_disable(); } - async_flip_requested.clear(); + if (emu_flip) + { + async_flip_requested.clear(flip_request::emu_requested); + } + else + { + async_flip_requested.clear(flip_request::native_ui); + } } if (!skip_frame) @@ -2462,7 +2469,7 @@ namespace rsx int_flip_index++; current_display_buffer = buffer; - flip(buffer); + flip(buffer, true); last_flip_time = get_system_time() - 1000000; flip_status = CELL_GCM_DISPLAY_FLIP_STATUS_DONE; diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 4701e040d6..09b21343d8 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -623,7 +623,7 @@ namespace rsx virtual void on_init_rsx() = 0; virtual void on_init_thread() = 0; virtual bool do_method(u32 /*cmd*/, u32 /*value*/) { return false; } - virtual void flip(int buffer) = 0; + virtual void flip(int buffer, bool emu_flip = false) = 0; virtual u64 timestamp(); virtual bool on_access_violation(u32 /*address*/, bool /*is_writing*/) { return false; } virtual void on_invalidate_memory_range(const address_range & /*range*/) {} diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index fab89a8fed..dd15891fa7 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2488,7 +2488,7 @@ void VKGSRender::do_local_task(rsx::FIFO_state state) if (!in_begin_end && async_flip_requested & flip_request::native_ui) { flush_command_queue(true); - flip((s32)current_display_buffer); + flip((s32)current_display_buffer, false); } } } @@ -3194,12 +3194,12 @@ void VKGSRender::reinitialize_swapchain() renderer_unavailable = false; } -void VKGSRender::flip(int buffer) +void VKGSRender::flip(int buffer, bool emu_flip) { if (skip_frame || renderer_unavailable) { m_frame->flip(m_context); - rsx::thread::flip(buffer); + rsx::thread::flip(buffer, emu_flip); if (!skip_frame) { @@ -3537,7 +3537,7 @@ void VKGSRender::flip(int buffer) //NOTE:Resource destruction is handled within the real swap handler m_frame->flip(m_context); - rsx::thread::flip(buffer); + rsx::thread::flip(buffer, emu_flip); //Do not reset perf counters if we are skipping the next frame if (skip_frame) return; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 221633af27..58d521cf30 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -466,7 +466,7 @@ protected: void on_init_thread() override; void on_exit() override; bool do_method(u32 id, u32 arg) override; - void flip(int buffer) override; + void flip(int buffer, bool emu_flip = false) override; void do_local_task(rsx::FIFO_state state) override; bool scaled_image_from_memory(rsx::blit_src_info& src, rsx::blit_dst_info& dst, bool interpolate) override;