From d47d597b3449f3c3911189a3f0e1cceb05ce9444 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 4 Jun 2020 21:46:42 +0300 Subject: [PATCH] vk: Make the depth-convert pass multisample aware --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 10 +++++----- rpcs3/Emu/RSX/VK/VKOverlays.h | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index a7e89b796c..5313825452 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -914,17 +914,18 @@ void VKGSRender::end() if (ds && ds->old_contents.size() == 1 && ds->old_contents[0].source->info.format == VK_FORMAT_B8G8R8A8_UNORM) { - auto key = vk::get_renderpass_key(ds->info.format); + auto key = vk::get_renderpass_key({ static_cast(ds) }); auto render_pass = vk::get_renderpass(*m_device, key); verify("Usupported renderpass configuration" HERE), render_pass != VK_NULL_HANDLE; VkClearDepthStencilValue clear = { 1.f, 0xFF }; VkImageSubresourceRange range = { VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1 }; - // Initialize source - auto src = vk::as_rtt(ds->old_contents[0].source); - src->read_barrier(*m_current_command_buffer); + // Initialize source data + auto srcobj = vk::as_rtt(ds->old_contents[0].source); + srcobj->read_barrier(*m_current_command_buffer); + auto src = srcobj->get_surface(rsx::surface_access::read); switch (src->current_layout) { case VK_IMAGE_LAYOUT_GENERAL: @@ -950,7 +951,6 @@ void VKGSRender::end() src->get_view(0xAAE4, rsx::default_remap_vector), ds, render_pass); - // TODO: Flush management to avoid pass running out of ubo space (very unlikely) ds->on_write(); } diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.h b/rpcs3/Emu/RSX/VK/VKOverlays.h index 29e8231acb..01d4621d0b 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.h +++ b/rpcs3/Emu/RSX/VK/VKOverlays.h @@ -407,7 +407,7 @@ namespace vk vs_src = "#version 450\n" "#extension GL_ARB_separate_shader_objects : enable\n" - "layout(std140, set=0, binding=0) uniform static_data{ vec4 regs[8]; };\n" + "layout(push_constant) uniform static_data{ vec2 scale; };\n" "layout(location=0) out vec2 tc0;\n" "\n" "void main()\n" @@ -415,7 +415,7 @@ namespace vk " vec2 positions[] = {vec2(-1., -1.), vec2(1., -1.), vec2(-1., 1.), vec2(1., 1.)};\n" " vec2 coords[] = {vec2(0., 0.), vec2(1., 0.), vec2(0., 1.), vec2(1., 1.)};\n" " gl_Position = vec4(positions[gl_VertexIndex % 4], 0., 1.);\n" - " tc0 = coords[gl_VertexIndex % 4] * regs[0].xy;\n" + " tc0 = coords[gl_VertexIndex % 4] * scale;\n" "}\n"; fs_src = @@ -435,15 +435,20 @@ namespace vk renderpass_config.enable_depth_test(VK_COMPARE_OP_ALWAYS); } - void update_uniforms(vk::command_buffer& /*cmd*/, vk::glsl::program* /*program*/) override + std::vector get_push_constants() override { - m_ubo_offset = static_cast(m_ubo.alloc<256>(128)); - auto dst = static_cast(m_ubo.map(m_ubo_offset, 128)); - dst[0] = src_scale_x; - dst[1] = src_scale_y; - dst[2] = 0.f; - dst[3] = 0.f; - m_ubo.unmap(); + VkPushConstantRange constant; + constant.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + constant.offset = 0; + constant.size = 8; + + return { constant }; + } + + void update_uniforms(vk::command_buffer& cmd, vk::glsl::program* /*program*/) override + { + float dst[2] = { src_scale_x, src_scale_y }; + vkCmdPushConstants(cmd, m_pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, 8, dst); } void run(vk::command_buffer& cmd, const areai& src_area, const areai& dst_area, vk::image_view* src, vk::image* dst, VkRenderPass render_pass) @@ -454,6 +459,9 @@ namespace vk src_scale_x = static_cast(src_area.x2) / real_src->width(); src_scale_y = static_cast(src_area.y2) / real_src->height(); + // Coverage sampling disabled, but actually report correct number of samples + renderpass_config.set_multisample_state(dst->samples(), 0xFFFF, false, false, false); + overlay_pass::run(cmd, static_cast(dst_area), dst, src, render_pass); } };