diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index ed79fb7370..6d154a8650 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -88,7 +88,7 @@ void GLFragmentDecompilerThread::insertOutputs(std::stringstream & OS) for (int i = 0; i < sizeof(table) / sizeof(*table); ++i) { if (m_parr.HasParam(PF_PARAM_NONE, "vec4", table[i].second)) - OS << "out vec4 " << table[i].first << ";\n"; + OS << "layout(location=" << i << ") out vec4 " << table[i].first << ";\n"; } } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index ce62b503e8..4cada0e7fc 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -29,7 +29,7 @@ namespace vk #define VK_ATTRIB_RING_BUFFER_SIZE_M 256 #define VK_UBO_RING_BUFFER_SIZE_M 64 #define VK_INDEX_RING_BUFFER_SIZE_M 64 -#define VK_TEXTURE_UPLOAD_RING_BUFFER_SIZE_M 64 +#define VK_TEXTURE_UPLOAD_RING_BUFFER_SIZE_M 128 #define VK_MAX_ASYNC_CB_COUNT 64 #define VK_MAX_ASYNC_FRAMES 2 diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index 71660ae36d..3d07ad4b99 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -12,6 +12,7 @@ namespace rsx struct blit_src_info { blit_engine::transfer_source_format format; + blit_engine::transfer_origin origin; u16 offset_x; u16 offset_y; u16 width; diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 1079b93b88..cbab79a444 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -539,10 +539,16 @@ namespace rsx u16 in_pitch = method_registers.blit_engine_input_pitch(); + if (in_w == 0 || in_h == 0 || out_w == 0 || out_h == 0) + { + LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: Invalid blit dimensions passed"); + return; + } + if (in_origin != blit_engine::transfer_origin::corner) { - LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: unknown origin (%d)", (u8)in_origin); - return; + // Probably refers to texel geometry which would affect clipping algorithm slightly when rounding texel addresses + LOG_WARNING(RSX, "NV3089_IMAGE_IN_SIZE: unknown origin (%d)", (u8)in_origin); } if (operation != rsx::blit_engine::transfer_operation::srccopy) @@ -613,25 +619,12 @@ namespace rsx LOG_ERROR(RSX, "NV3089_IMAGE_IN_SIZE: unknown src_color_format (%d)", (u8)src_color_format); } - std::unique_ptr temp1, temp2, sw_temp; - - AVPixelFormat in_format = (src_color_format == rsx::blit_engine::transfer_source_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; - AVPixelFormat out_format = (dst_color_format == rsx::blit_engine::transfer_destination_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; - f32 scale_x = 1048576.f / method_registers.blit_engine_ds_dx(); f32 scale_y = 1048576.f / method_registers.blit_engine_dt_dy(); u32 convert_w = (u32)(scale_x * in_w); u32 convert_h = (u32)(scale_y * in_h); - bool need_clip = - clip_w != in_w || - clip_h != in_h || - clip_x > 0 || clip_y > 0 || - convert_w != out_w || convert_h != out_h; - - bool need_convert = out_format != in_format || scale_x != 1.0 || scale_y != 1.0; - u32 slice_h = clip_h; if (src_region.tile) @@ -659,6 +652,7 @@ namespace rsx blit_dst_info dst_info; src_info.format = src_color_format; + src_info.origin = in_origin; src_info.width = in_w; src_info.height = in_h; src_info.pitch = in_pitch; @@ -686,6 +680,19 @@ namespace rsx return; } + std::unique_ptr temp1, temp2, sw_temp; + + const AVPixelFormat in_format = (src_color_format == rsx::blit_engine::transfer_source_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; + const AVPixelFormat out_format = (dst_color_format == rsx::blit_engine::transfer_destination_format::r5g6b5) ? AV_PIX_FMT_RGB565BE : AV_PIX_FMT_ARGB; + + const bool need_clip = + clip_w != in_w || + clip_h != in_h || + clip_x > 0 || clip_y > 0 || + convert_w != out_w || convert_h != out_h; + + const bool need_convert = out_format != in_format || scale_x != 1.0 || scale_y != 1.0; + if (method_registers.blit_engine_context_surface() != blit_engine::context_surface::swizzle2d) { if (need_convert || need_clip) @@ -1458,6 +1465,7 @@ namespace rsx bind_array(); bind_array(); bind_array(); + bind_array<(0xac00 >> 2), 1, 16, nullptr>(); // Unknown texture control register // NV406E bind();