diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 5d8afadfc5..20e7ee016d 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1163,20 +1163,6 @@ void GLGSRender::update_draw_state() gl_state.enable(rsx::method_registers.dither_enabled(), GL_DITHER); - if (gl_state.enable(rsx::method_registers.blend_enabled(), GL_BLEND)) - { - glBlendFuncSeparate(blend_factor(rsx::method_registers.blend_func_sfactor_rgb()), - blend_factor(rsx::method_registers.blend_func_dfactor_rgb()), - blend_factor(rsx::method_registers.blend_func_sfactor_a()), - blend_factor(rsx::method_registers.blend_func_dfactor_a())); - - auto blend_colors = rsx::get_constant_blend_colors(); - glBlendColor(blend_colors[0], blend_colors[1], blend_colors[2], blend_colors[3]); - - glBlendEquationSeparate(blend_equation(rsx::method_registers.blend_equation_rgb()), - blend_equation(rsx::method_registers.blend_equation_a())); - } - if (gl_state.enable(rsx::method_registers.stencil_test_enabled(), GL_STENCIL_TEST)) { glStencilFunc(comparison_op(rsx::method_registers.stencil_func()), @@ -1198,9 +1184,32 @@ void GLGSRender::update_draw_state() } } - gl_state.enablei(rsx::method_registers.blend_enabled_surface_1(), GL_BLEND, 1); - gl_state.enablei(rsx::method_registers.blend_enabled_surface_2(), GL_BLEND, 2); - gl_state.enablei(rsx::method_registers.blend_enabled_surface_3(), GL_BLEND, 3); + const bool mrt_blend_enabled[] = + { + rsx::method_registers.blend_enabled(), + rsx::method_registers.blend_enabled_surface_1(), + rsx::method_registers.blend_enabled_surface_2(), + rsx::method_registers.blend_enabled_surface_3() + }; + + if (mrt_blend_enabled[0] || mrt_blend_enabled[1] || mrt_blend_enabled[2] || mrt_blend_enabled[3]) + { + glBlendFuncSeparate(blend_factor(rsx::method_registers.blend_func_sfactor_rgb()), + blend_factor(rsx::method_registers.blend_func_dfactor_rgb()), + blend_factor(rsx::method_registers.blend_func_sfactor_a()), + blend_factor(rsx::method_registers.blend_func_dfactor_a())); + + auto blend_colors = rsx::get_constant_blend_colors(); + glBlendColor(blend_colors[0], blend_colors[1], blend_colors[2], blend_colors[3]); + + glBlendEquationSeparate(blend_equation(rsx::method_registers.blend_equation_rgb()), + blend_equation(rsx::method_registers.blend_equation_a())); + } + + gl_state.enablei(mrt_blend_enabled[0], GL_BLEND, 0); + gl_state.enablei(mrt_blend_enabled[1], GL_BLEND, 1); + gl_state.enablei(mrt_blend_enabled[2], GL_BLEND, 2); + gl_state.enablei(mrt_blend_enabled[3], GL_BLEND, 3); if (gl_state.enable(rsx::method_registers.logic_op_enabled(), GL_COLOR_LOGIC_OP)) { diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 0868361f50..b4e6ec66ba 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2182,16 +2182,20 @@ void VKGSRender::load_program(const vk::vertex_upload_info& vertex_info) if (rsx::method_registers.color_mask_g()) mask |= VK_COLOR_COMPONENT_G_BIT; if (rsx::method_registers.color_mask_r()) mask |= VK_COLOR_COMPONENT_R_BIT; - VkColorComponentFlags color_masks[4] = { mask }; - - u8 render_targets[] = { 0, 1, 2, 3 }; - for (u8 idx = 0; idx < m_draw_buffers_count; ++idx) { - properties.att_state[render_targets[idx]].colorWriteMask = mask; + properties.att_state[idx].colorWriteMask = mask; } - if (rsx::method_registers.blend_enabled()) + const bool mrt_blend_enabled[] = + { + rsx::method_registers.blend_enabled(), + rsx::method_registers.blend_enabled_surface_1(), + rsx::method_registers.blend_enabled_surface_2(), + rsx::method_registers.blend_enabled_surface_3() + }; + + if (mrt_blend_enabled[0] || mrt_blend_enabled[1] || mrt_blend_enabled[2] || mrt_blend_enabled[3]) { VkBlendFactor sfactor_rgb = vk::get_blend_factor(rsx::method_registers.blend_func_sfactor_rgb()); VkBlendFactor sfactor_a = vk::get_blend_factor(rsx::method_registers.blend_func_sfactor_a()); @@ -2203,20 +2207,16 @@ void VKGSRender::load_program(const vk::vertex_upload_info& vertex_info) for (u8 idx = 0; idx < m_draw_buffers_count; ++idx) { - properties.att_state[render_targets[idx]].blendEnable = VK_TRUE; - properties.att_state[render_targets[idx]].srcColorBlendFactor = sfactor_rgb; - properties.att_state[render_targets[idx]].dstColorBlendFactor = dfactor_rgb; - properties.att_state[render_targets[idx]].srcAlphaBlendFactor = sfactor_a; - properties.att_state[render_targets[idx]].dstAlphaBlendFactor = dfactor_a; - properties.att_state[render_targets[idx]].colorBlendOp = equation_rgb; - properties.att_state[render_targets[idx]].alphaBlendOp = equation_a; - } - } - else - { - for (u8 idx = 0; idx < m_draw_buffers_count; ++idx) - { - properties.att_state[render_targets[idx]].blendEnable = VK_FALSE; + if (mrt_blend_enabled[idx]) + { + properties.att_state[idx].blendEnable = VK_TRUE; + properties.att_state[idx].srcColorBlendFactor = sfactor_rgb; + properties.att_state[idx].dstColorBlendFactor = dfactor_rgb; + properties.att_state[idx].srcAlphaBlendFactor = sfactor_a; + properties.att_state[idx].dstAlphaBlendFactor = dfactor_a; + properties.att_state[idx].colorBlendOp = equation_rgb; + properties.att_state[idx].alphaBlendOp = equation_a; + } } }