diff options
| author | Mark Lobodzinski <mark@lunarg.com> | 2017-02-27 12:56:14 -0700 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-02-28 09:43:23 -0700 |
| commit | 19e645e05c18db1a107bc6fc96470c790c5c3c95 (patch) | |
| tree | 62f4ab6955a36958bd388c4b99a8c6ab6459a33a /layers/buffer_validation.cpp | |
| parent | 6b5b6c4e5fe54773e77a7bbff8b3ca83f80c4659 (diff) | |
| download | usermoji-19e645e05c18db1a107bc6fc96470c790c5c3c95.tar.xz | |
layers: Split layout transition validation/recording
Split TransitionImageLayouts and TransitionImageAspectLayouts into
ValidateXxx and TransitionXxx routines.
Change-Id: I19666e5ccc444cfc23304fd35aa1b9b18b039499
Diffstat (limited to 'layers/buffer_validation.cpp')
| -rw-r--r-- | layers/buffer_validation.cpp | 64 |
1 files changed, 52 insertions, 12 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index b9f15df3..ed648cb3 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -334,16 +334,14 @@ void TransitionSubpassLayouts(layer_data *device_data, GLOBAL_CB_NODE *pCB, cons } } -bool TransitionImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, const VkImageMemoryBarrier *mem_barrier, - uint32_t level, uint32_t layer, VkImageAspectFlags aspect) { +bool ValidateImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, const VkImageMemoryBarrier *mem_barrier, + uint32_t level, uint32_t layer, VkImageAspectFlags aspect) { if (!(mem_barrier->subresourceRange.aspectMask & aspect)) { return false; } VkImageSubresource sub = {aspect, level, layer}; IMAGE_CMD_BUF_LAYOUT_NODE node; if (!FindCmdBufLayout(device_data, pCB, mem_barrier->image, sub, node)) { - SetLayout(device_data, pCB, mem_barrier->image, sub, - IMAGE_CMD_BUF_LAYOUT_NODE(mem_barrier->oldLayout, mem_barrier->newLayout)); return false; } bool skip = false; @@ -355,13 +353,29 @@ bool TransitionImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, c "You cannot transition the layout of aspect %d from %s when current layout is %s.", aspect, string_VkImageLayout(mem_barrier->oldLayout), string_VkImageLayout(node.layout)); } - SetLayout(device_data, pCB, mem_barrier->image, sub, mem_barrier->newLayout); return skip; } -// TODO: Separate validation and layout state updates -bool TransitionImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, - const VkImageMemoryBarrier *pImgMemBarriers) { +void TransitionImageAspectLayout(layer_data *device_data, GLOBAL_CB_NODE *pCB, const VkImageMemoryBarrier *mem_barrier, + uint32_t level, uint32_t layer, VkImageAspectFlags aspect) { + if (!(mem_barrier->subresourceRange.aspectMask & aspect)) { + return; + } + VkImageSubresource sub = {aspect, level, layer}; + IMAGE_CMD_BUF_LAYOUT_NODE node; + if (!FindCmdBufLayout(device_data, pCB, mem_barrier->image, sub, node)) { + SetLayout(device_data, pCB, mem_barrier->image, sub, + IMAGE_CMD_BUF_LAYOUT_NODE(mem_barrier->oldLayout, mem_barrier->newLayout)); + return; + } + if (mem_barrier->oldLayout == VK_IMAGE_LAYOUT_UNDEFINED) { + // TODO: Set memory invalid + } + SetLayout(device_data, pCB, mem_barrier->image, sub, mem_barrier->newLayout); +} + +bool ValidateImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, + const VkImageMemoryBarrier *pImgMemBarriers) { GLOBAL_CB_NODE *pCB = GetCBNode(device_data, cmdBuffer); bool skip = false; uint32_t levelCount = 0; @@ -378,16 +392,42 @@ bool TransitionImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t level = mem_barrier->subresourceRange.baseMipLevel + j; for (uint32_t k = 0; k < layerCount; k++) { uint32_t layer = mem_barrier->subresourceRange.baseArrayLayer + k; - skip |= TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_COLOR_BIT); - skip |= TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); - skip |= TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); - skip |= TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); + skip |= ValidateImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_COLOR_BIT); + skip |= ValidateImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); + skip |= ValidateImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); + skip |= ValidateImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); } } } return skip; } +void TransitionImageLayouts(layer_data *device_data, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount, + const VkImageMemoryBarrier *pImgMemBarriers) { + GLOBAL_CB_NODE *pCB = GetCBNode(device_data, cmdBuffer); + uint32_t levelCount = 0; + uint32_t layerCount = 0; + + for (uint32_t i = 0; i < memBarrierCount; ++i) { + auto mem_barrier = &pImgMemBarriers[i]; + if (!mem_barrier) continue; + // TODO: Do not iterate over every possibility - consolidate where possible + ResolveRemainingLevelsLayers(device_data, &levelCount, &layerCount, mem_barrier->subresourceRange, + GetImageState(device_data, mem_barrier->image)); + + for (uint32_t j = 0; j < levelCount; j++) { + uint32_t level = mem_barrier->subresourceRange.baseMipLevel + j; + for (uint32_t k = 0; k < layerCount; k++) { + uint32_t layer = mem_barrier->subresourceRange.baseArrayLayer + k; + TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_COLOR_BIT); + TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_DEPTH_BIT); + TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_STENCIL_BIT); + TransitionImageAspectLayout(device_data, pCB, mem_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); + } + } + } +} + bool VerifySourceImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, VkImage srcImage, VkImageSubresourceLayers subLayers, VkImageLayout srcImageLayout, UNIQUE_VALIDATION_ERROR_CODE msgCode) { const auto report_data = core_validation::GetReportData(device_data); |
