From d94986ff0de5a7cfbbad6ab39cc79533037716ef Mon Sep 17 00:00:00 2001 From: kd-11 Date: Wed, 15 Mar 2017 15:32:36 +0300 Subject: [PATCH] rsx: Set up hw accelerated blit --- rpcs3/Emu/RSX/RSXThread.h | 2 ++ rpcs3/Emu/RSX/rsx_cache.h | 26 ++++++++++++++++++++++++++ rpcs3/Emu/RSX/rsx_methods.cpp | 26 +++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 0d534a84fd..cd9f640721 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -348,6 +348,8 @@ namespace rsx virtual std::pair get_programs() const { return std::make_pair("", ""); }; + virtual bool scaled_image_from_memory(blit_src_info& src_info, blit_dst_info& dst_info, bool interpolate){ return false; } + struct raw_program get_raw_program() const; public: void reset(); diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index cd68b65638..8a31197b9b 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -30,6 +30,32 @@ namespace rsx void(*remove_shader)(void *ptr); }; + struct blit_src_info + { + blit_engine::transfer_source_format format; + u16 offset_x; + u16 offset_y; + u16 width; + u16 height; + u16 slice; + u16 pitch; + void *pixels; + }; + + struct blit_dst_info + { + blit_engine::transfer_destination_format format; + u16 width; + u16 height; + u16 pitch; + u16 clip_x; + u16 clip_y; + u16 clip_width; + u16 clip_height; + bool swizzled; + void *pixels; + }; + class shaders_cache { struct entry_t diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index bde77fbee6..3600dfb4d5 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -573,10 +573,34 @@ namespace rsx } } + blit_src_info src_info; + blit_dst_info dst_info; + + src_info.format = src_color_format; + src_info.width = in_w; + src_info.height = in_h; + src_info.pitch = in_pitch; + src_info.slice = slice_h; + src_info.pixels = pixels_src; + + dst_info.format = dst_color_format; + dst_info.width = convert_w; + dst_info.height = convert_h; + dst_info.clip_x = clip_x; + dst_info.clip_y = clip_y; + dst_info.clip_width = clip_w; + dst_info.clip_height = clip_h; + dst_info.pitch = in_pitch; + dst_info.pixels = pixels_dst; + dst_info.swizzled = (method_registers.blit_engine_context_surface() == blit_engine::context_surface::swizzle2d); + + if (rsx->scaled_image_from_memory(src_info, dst_info, in_inter == blit_engine::transfer_interpolator::foh)) + return; + if (method_registers.blit_engine_context_surface() != blit_engine::context_surface::swizzle2d) { if (need_convert || need_clip) - { + { if (need_clip) { if (need_convert)