From fbb7186e6637b83a6cab0ecd1e397ddf5a12f2b6 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 2 Nov 2017 19:12:08 +0300 Subject: [PATCH] rsx/gl: Addendum - Fix fragment shader to consume texture scale parameters --- rpcs3/Emu/RSX/Common/texture_cache.h | 17 ++++++++++------- rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/texture_cache.h b/rpcs3/Emu/RSX/Common/texture_cache.h index 5297475bdf..0c4f5b2406 100644 --- a/rpcs3/Emu/RSX/Common/texture_cache.h +++ b/rpcs3/Emu/RSX/Common/texture_cache.h @@ -987,7 +987,7 @@ namespace rsx } template - sampled_image_descriptor process_framebuffer_resource(render_target_type texptr, const u32 texaddr, const u32 format, surface_store_type& m_rtts, + sampled_image_descriptor process_framebuffer_resource(render_target_type texptr, const u32 texaddr, const u32 gcm_format, surface_store_type& m_rtts, const u16 tex_width, const u16 tex_height, const rsx::texture_dimension_extended extended_dimension, const bool is_depth) { if (extended_dimension != rsx::texture_dimension_extended::texture_dimension_2d && @@ -1025,8 +1025,10 @@ namespace rsx texptr->aa_mode = aa_mode; } - f32 scale_x = get_internal_scaling_x(texptr); - f32 scale_y = get_internal_scaling_y(texptr); + const u32 format = gcm_format & ~(CELL_GCM_TEXTURE_UN | CELL_GCM_TEXTURE_LN); + const bool unnormalized = (gcm_format & CELL_GCM_TEXTURE_UN) != 0; + f32 scale_x = (unnormalized)? get_internal_scaling_x(texptr) : 1.f; + f32 scale_y = (unnormalized)? get_internal_scaling_y(texptr) : 1.f; if (extended_dimension == rsx::texture_dimension_extended::texture_dimension_1d) { @@ -1132,7 +1134,7 @@ namespace rsx { if (test_framebuffer(texaddr)) { - return process_framebuffer_resource(texptr, texaddr, format, m_rtts, tex_width, tex_height, extended_dimension, false); + return process_framebuffer_resource(texptr, texaddr, tex.format(), m_rtts, tex_width, tex_height, extended_dimension, false); } else { @@ -1145,7 +1147,7 @@ namespace rsx { if (test_framebuffer(texaddr)) { - return process_framebuffer_resource(texptr, texaddr, format, m_rtts, tex_width, tex_height, extended_dimension, true); + return process_framebuffer_resource(texptr, texaddr, tex.format(), m_rtts, tex_width, tex_height, extended_dimension, true); } else { @@ -1185,8 +1187,9 @@ namespace rsx } else { - f32 scale_x = get_internal_scaling_x(rsc.surface); - f32 scale_y = get_internal_scaling_x(rsc.surface); + const bool unnormalized = (tex.format() & CELL_GCM_TEXTURE_UN) != 0; + f32 scale_x = (unnormalized)? get_internal_scaling_x(rsc.surface) : 1.f; + f32 scale_y = (unnormalized)? get_internal_scaling_x(rsc.surface) : 1.f; u16 internal_height = rsx::apply_resolution_scale(rsc.h, true); if (extended_dimension == rsx::texture_dimension_extended::texture_dimension_1d) diff --git a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp index 32fc25283a..a83d138184 100644 --- a/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/GL/GLFragmentProgram.cpp @@ -177,7 +177,7 @@ namespace if (prog.unnormalized_coords & (1 << index)) OS << "\t" << vec_type << " tex" << index << "_coord_scale = texture_parameters[" << index << "].xy / textureSize(tex" << index << ", 0);\n"; else - OS << "\t" << vec_type << " tex" << index << "_coord_scale = " << vec_type << "(1.);\n"; + OS << "\t" << vec_type << " tex" << index << "_coord_scale = texture_parameters[" << index << "].xy;\n"; } std::string insert_texture_fetch(const RSXFragmentProgram& prog, int index)