|
|
@ -1048,6 +1048,11 @@ VkImageView TextureCacheRuntime::GetOrCreateResolveShadow(VkImage msaa_image, Vk |
|
|
shadow.up_to_date = true; |
|
|
shadow.up_to_date = true; |
|
|
return *shadow.view; |
|
|
return *shadow.view; |
|
|
} |
|
|
} |
|
|
|
|
|
const VkImageUsageFlags shadow_usage = |
|
|
|
|
|
static_cast<VkImageUsageFlags>(is_depth_stencil |
|
|
|
|
|
? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
|
|
|
|
|
: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) | |
|
|
|
|
|
VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; |
|
|
shadow.image = memory_allocator.CreateImage(VkImageCreateInfo{ |
|
|
shadow.image = memory_allocator.CreateImage(VkImageCreateInfo{ |
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, |
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, |
|
|
.pNext = nullptr, |
|
|
.pNext = nullptr, |
|
|
@ -1059,9 +1064,7 @@ VkImageView TextureCacheRuntime::GetOrCreateResolveShadow(VkImage msaa_image, Vk |
|
|
.arrayLayers = layers, |
|
|
.arrayLayers = layers, |
|
|
.samples = VK_SAMPLE_COUNT_1_BIT, |
|
|
.samples = VK_SAMPLE_COUNT_1_BIT, |
|
|
.tiling = VK_IMAGE_TILING_OPTIMAL, |
|
|
.tiling = VK_IMAGE_TILING_OPTIMAL, |
|
|
.usage = (is_depth_stencil ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT |
|
|
|
|
|
: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) | |
|
|
|
|
|
VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, |
|
|
|
|
|
|
|
|
.usage = shadow_usage, |
|
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE, |
|
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE, |
|
|
.queueFamilyIndexCount = 0, |
|
|
.queueFamilyIndexCount = 0, |
|
|
.pQueueFamilyIndices = nullptr, |
|
|
.pQueueFamilyIndices = nullptr, |
|
|
@ -1088,16 +1091,20 @@ VkImageView TextureCacheRuntime::GetOrCreateResolveShadow(VkImage msaa_image, Vk |
|
|
shadow.layers = layers; |
|
|
shadow.layers = layers; |
|
|
shadow.up_to_date = true; |
|
|
shadow.up_to_date = true; |
|
|
if (device.IsKhrDynamicRenderingSupported()) { |
|
|
if (device.IsKhrDynamicRenderingSupported()) { |
|
|
|
|
|
const VkAccessFlags dst_access = |
|
|
|
|
|
is_depth_stencil ? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
|
|
|
|
|
: VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; |
|
|
|
|
|
const VkPipelineStageFlags dst_stage = |
|
|
|
|
|
is_depth_stencil ? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
|
|
|
|
|
: VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; |
|
|
scheduler.RecordWithUploadBuffer( |
|
|
scheduler.RecordWithUploadBuffer( |
|
|
[image = *shadow.image, layers, aspect, is_depth_stencil]( |
|
|
|
|
|
|
|
|
[image = *shadow.image, layers, aspect, dst_access, dst_stage]( |
|
|
vk::CommandBuffer, vk::CommandBuffer upload_cmdbuf) { |
|
|
vk::CommandBuffer, vk::CommandBuffer upload_cmdbuf) { |
|
|
const VkImageMemoryBarrier barrier{ |
|
|
const VkImageMemoryBarrier barrier{ |
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, |
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, |
|
|
.pNext = nullptr, |
|
|
.pNext = nullptr, |
|
|
.srcAccessMask = 0, |
|
|
.srcAccessMask = 0, |
|
|
.dstAccessMask = is_depth_stencil |
|
|
|
|
|
? VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
|
|
|
|
|
: VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, |
|
|
|
|
|
|
|
|
.dstAccessMask = dst_access, |
|
|
.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, |
|
|
.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, |
|
|
.newLayout = VK_IMAGE_LAYOUT_GENERAL, |
|
|
.newLayout = VK_IMAGE_LAYOUT_GENERAL, |
|
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, |
|
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, |
|
|
@ -1111,11 +1118,8 @@ VkImageView TextureCacheRuntime::GetOrCreateResolveShadow(VkImage msaa_image, Vk |
|
|
.layerCount = layers, |
|
|
.layerCount = layers, |
|
|
}, |
|
|
}, |
|
|
}; |
|
|
}; |
|
|
upload_cmdbuf.PipelineBarrier( |
|
|
|
|
|
VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, |
|
|
|
|
|
is_depth_stencil ? VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
|
|
|
|
|
: VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, |
|
|
|
|
|
0, barrier); |
|
|
|
|
|
|
|
|
upload_cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, dst_stage, 0, |
|
|
|
|
|
barrier); |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
return *shadow.view; |
|
|
return *shadow.view; |
|
|
|