vk: Make the depth-convert pass multisample aware

This commit is contained in:
kd-11 2020-06-04 21:46:42 +03:00 committed by kd-11
parent 69c2150fbd
commit d47d597b34
2 changed files with 23 additions and 15 deletions

View File

@ -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<vk::image*>(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();
}

View File

@ -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<VkPushConstantRange> get_push_constants() override
{
m_ubo_offset = static_cast<u32>(m_ubo.alloc<256>(128));
auto dst = static_cast<f32*>(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<f32>(src_area.x2) / real_src->width();
src_scale_y = static_cast<f32>(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<areau>(dst_area), dst, src, render_pass);
}
};