mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-01-31 20:41:45 +01:00
vk: Make the depth-convert pass multisample aware
This commit is contained in:
parent
69c2150fbd
commit
d47d597b34
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user