diff options
| author | Tobin Ehlis <tobine@google.com> | 2017-05-11 08:52:51 -0600 |
|---|---|---|
| committer | Mark Lobodzinski <mark@lunarg.com> | 2017-05-17 08:15:42 -0600 |
| commit | ad190dca307a079766a6f558ddda4e2774b2c136 (patch) | |
| tree | 9bcbadd864d7ec25b63ea2556d8314677631a1f1 /layers/buffer_validation.cpp | |
| parent | 4d1154c806f46d44166278f52197e72df1ca3150 (diff) | |
| download | usermoji-ad190dca307a079766a6f558ddda4e2774b2c136.tar.xz | |
layers: Validate shared presentable image cases
Add validation support for shared presentable images as defined in
VK_KHR_shared_presentable_image extension.
For all uses of shared presentable images, make sure that the image is
appropriately in VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout.
For two cases where no layout validation was performed, added a TODO
note (vkCmdBlitImage, vkCmdResolveImage) as basic layout validation
should first be added upstream.
Also locked the layout in the case where a front-buffered image is
presented and then flag an error if an attempt is made to transition
the image layout after that point.
Change-Id: I06cda727e3a7f56ccff4bffd7503b5ff73e8a795
Diffstat (limited to 'layers/buffer_validation.cpp')
| -rw-r--r-- | layers/buffer_validation.cpp | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp index 30b91681..3fd4e9ab 100644 --- a/layers/buffer_validation.cpp +++ b/layers/buffer_validation.cpp @@ -472,6 +472,24 @@ bool ValidateBarriersToImages(layer_data *device_data, VkCommandBuffer cmdBuffer auto img_barrier = &pImageMemoryBarriers[i]; if (!img_barrier) continue; + auto image_state = GetImageState(device_data, img_barrier->image); + if (image_state) { + VkImageUsageFlags usage_flags = image_state->createInfo.usage; + skip |= ValidateBarrierLayoutToImageUsage(device_data, img_barrier, false, usage_flags, func_name); + skip |= ValidateBarrierLayoutToImageUsage(device_data, img_barrier, true, usage_flags, func_name); + + // Make sure layout is able to be transitioned, currently only presented shared presentable images are locked + if (image_state->layout_locked) { + // TODO: Add unique id for error when available + skip |= log_msg(core_validation::GetReportData(device_data), VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, 0, "DS", + "Attempting to transition shared presentable image 0x%" PRIxLEAST64 + " from layout %s to layout %s, but image has already been presented and cannot have its layout transitioned.", + reinterpret_cast<const uint64_t &>(img_barrier->image), string_VkImageLayout(img_barrier->oldLayout), + string_VkImageLayout(img_barrier->newLayout)); + } + } + VkImageCreateInfo *image_create_info = &(GetImageState(device_data, img_barrier->image)->createInfo); // For a Depth/Stencil image both aspects MUST be set if (FormatIsDepthAndStencil(image_create_info->format)) { @@ -502,13 +520,6 @@ bool ValidateBarriersToImages(layer_data *device_data, VkCommandBuffer cmdBuffer skip |= ValidateImageAspectLayout(device_data, pCB, img_barrier, level, layer, VK_IMAGE_ASPECT_METADATA_BIT); } } - - IMAGE_STATE *image_state = GetImageState(device_data, img_barrier->image); - if (image_state) { - VkImageUsageFlags usage_flags = image_state->createInfo.usage; - skip |= ValidateBarrierLayoutToImageUsage(device_data, img_barrier, false, usage_flags, func_name); - skip |= ValidateBarrierLayoutToImageUsage(device_data, img_barrier, true, usage_flags, func_name); - } } return skip; } @@ -573,6 +584,14 @@ bool VerifyImageLayout(layer_data const *device_data, GLOBAL_CB_NODE const *cb_n "%s: For optimal performance image 0x%" PRIxLEAST64 " layout should be %s instead of GENERAL.", caller, reinterpret_cast<const uint64_t &>(image), string_VkImageLayout(optimal_layout)); } + } else if (image_state->shared_presentable) { + if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != explicit_layout) { + // TODO: Add unique error id when available. + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, msg_code, "DS", + "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", + string_VkImageLayout(optimal_layout)); + } } else { *error = true; skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, @@ -878,6 +897,14 @@ bool VerifyClearImageLayout(layer_data *device_data, GLOBAL_CB_NODE *cb_node, IM reinterpret_cast<uint64_t &>(image_state->image), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "%s: Layout for cleared image should be TRANSFER_DST_OPTIMAL instead of GENERAL.", func_name); } + } else if (image_state->shared_presentable) { + if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != dest_image_layout) { + // TODO: Add unique error id when available. + skip |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 0, "DS", + "Layout for shared presentable cleared image is %s but can only be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.", + string_VkImageLayout(dest_image_layout)); + } } else { UNIQUE_VALIDATION_ERROR_CODE error_code = VALIDATION_ERROR_01086; if (strcmp(func_name, "vkCmdClearDepthStencilImage()") == 0) { @@ -1809,6 +1836,7 @@ bool PreCallValidateCmdResolveImage(layer_data *device_data, GLOBAL_CB_NODE *cb_ reinterpret_cast<uint64_t>(cb_node->commandBuffer), __LINE__, VALIDATION_ERROR_01321, "IMAGE", "%s. %s", str, validation_error_map[VALIDATION_ERROR_01321]); } + // TODO: Need to validate image layouts, which will include layout validation for shared presentable images } else { assert(0); } @@ -1852,6 +1880,7 @@ bool PreCallValidateCmdBlitImage(layer_data *device_data, GLOBAL_CB_NODE *cb_nod skip |= ValidateCmdQueueFlags(device_data, cb_node, "vkCmdBlitImage()", VK_QUEUE_GRAPHICS_BIT, VALIDATION_ERROR_01299); skip |= ValidateCmd(device_data, cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()"); skip |= insideRenderPass(device_data, cb_node, "vkCmdBlitImage()", VALIDATION_ERROR_01300); + // TODO: Need to validate image layouts, which will include layout validation for shared presentable images for (uint32_t i = 0; i < regionCount; i++) { // Warn for zero-sized regions @@ -2279,9 +2308,14 @@ bool ValidateLayouts(core_validation::layer_data *device_data, VkDevice device, auto attach_index = subpass.pColorAttachments[j].attachment; if (attach_index == VK_ATTACHMENT_UNUSED) continue; + // TODO: Need a way to validate shared presentable images here, currently just allowing + // VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR + // as an acceptable layout, but need to make sure shared presentable images ONLY use that layout switch (subpass.pColorAttachments[j].layout) { case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: // This is ideal. + case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR: + // TODO: See note above, just assuming that attachment is shared presentable and allowing this for now. break; case VK_IMAGE_LAYOUT_GENERAL: |
