vk: Lazy-initialize image resource on first use when owned by a separate queue

This commit is contained in:
kd-11 2021-02-28 21:42:18 +03:00 committed by kd-11
commit d2993474fb
2 changed files with 35 additions and 45 deletions

View file

@ -386,7 +386,7 @@ void VKGSRender::bind_texture_env()
//case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: //case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst); //ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst);
raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
@ -526,7 +526,7 @@ void VKGSRender::bind_texture_env()
//case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: //case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst); //ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst);
raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
@ -634,7 +634,7 @@ void VKGSRender::bind_interpreter_texture_env()
//case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: //case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst); //ensure(sampler_state->upload_context == rsx::texture_upload_context::blit_engine_dst);
raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); raw->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
break; break;
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:

View file

@ -873,7 +873,6 @@ namespace vk
region.set_dirty(false); region.set_dirty(false);
image->native_component_map = apply_component_mapping_flags(gcm_format, flags, rsx::default_remap_vector); image->native_component_map = apply_component_mapping_flags(gcm_format, flags, rsx::default_remap_vector);
image->change_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
// Its not necessary to lock blit dst textures as they are just reused as necessary // Its not necessary to lock blit dst textures as they are just reused as necessary
switch (context) switch (context)
@ -927,20 +926,6 @@ namespace vk
rsx::texture_create_flags::default_component_order); rsx::texture_create_flags::default_component_order);
auto image = section->get_raw_texture(); auto image = section->get_raw_texture();
auto subres_range = section->get_raw_view()->info.subresourceRange;
switch (image->info.format)
{
case VK_FORMAT_D32_SFLOAT_S8_UINT:
case VK_FORMAT_D24_UNORM_S8_UINT:
subres_range.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT;
break;
default:
break;
}
change_image_layout(cmd, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, subres_range);
vk::enter_uninterruptible(); vk::enter_uninterruptible();
bool input_swizzled = swizzled; bool input_swizzled = swizzled;
@ -950,12 +935,16 @@ namespace vk
input_swizzled = false; input_swizzled = false;
} }
vk::upload_image(cmd, image, subresource_layout, gcm_format, input_swizzled, mipmaps, subres_range.aspectMask, vk::upload_image(cmd, image, subresource_layout, gcm_format, input_swizzled, mipmaps, image->aspect(),
*m_texture_upload_heap, upload_heap_align_default, upload_contents_inline); *m_texture_upload_heap, upload_heap_align_default, initialize_image_layout | upload_contents_inline);
vk::leave_uninterruptible(); vk::leave_uninterruptible();
// Insert appropriate barrier depending on use if (context != rsx::texture_upload_context::shader_read)
{
// Insert appropriate barrier depending on use. Shader read resources should be lazy-initialized before consuming.
// TODO: All texture resources should be initialized on use, this is wasteful
VkImageLayout preferred_layout; VkImageLayout preferred_layout;
switch (context) switch (context)
{ {
@ -972,7 +961,7 @@ namespace vk
if (preferred_layout != image->current_layout) if (preferred_layout != image->current_layout)
{ {
change_image_layout(cmd, image, preferred_layout, subres_range); image->change_layout(cmd, preferred_layout);
} }
else else
{ {
@ -981,7 +970,8 @@ namespace vk
insert_image_memory_barrier(cmd, image->value, image->current_layout, preferred_layout, insert_image_memory_barrier(cmd, image->value, image->current_layout, preferred_layout,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
subres_range); { image->aspect(), 0, image->mipmaps(), 0, image->layers() });
}
} }
section->last_write_tag = rsx::get_shared_tag(); section->last_write_tag = rsx::get_shared_tag();