aboutsummaryrefslogtreecommitdiff
path: root/layers
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2017-07-18 11:22:08 -0600
committerTobin Ehlis <tobine@google.com>2017-07-18 14:08:38 -0600
commit3fe1dd8b0cf3a420d01af3a5bc6d4c94a10f4c0b (patch)
tree20a15697e09354a1a36015bce17544ddf1afd809 /layers
parent045efe91ea32ecf24bad4842fe0aac46dd3a5483 (diff)
downloadusermoji-3fe1dd8b0cf3a420d01af3a5bc6d4c94a10f4c0b.tar.xz
layers:Handle ALL_*_BIT pipe stage barrier validation
Update barrier validation to handle VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT and VK_PIPELINE_STAGE_ALL_COMMANDS_BIT cases in the subpass dependency. Expand GFX bit as it's an alias for a fixed set of bits. If ALL_COMMANDS is specified then skip validation because we know that barrier mask must be a subset of subpass mask.
Diffstat (limited to 'layers')
-rw-r--r--layers/core_validation.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index e85ceeed..6bacc3ba 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -6143,6 +6143,18 @@ VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent
if (!skip) dev_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
}
+// Return input pipeline stage flags, expanded for individual bits if VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT
+static VkPipelineStageFlags ExpandPipelineStageFlags(VkPipelineStageFlags inflags) {
+ return (inflags != VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT)
+ ? inflags
+ : (VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
+}
+
// Validate VUs for Pipeline Barriers that are within a renderPass
// Pre: cb_state->activeRenderPass must be a pointer to valid renderPass state
static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const char *funcName, GLOBAL_CB_NODE const *cb_state,
@@ -6162,9 +6174,10 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch
} else {
assert(rp_state->subpass_to_dependency_index[cb_state->activeSubpass] != -1);
const auto &sub_dep = rp_state->createInfo.pDependencies[rp_state->subpass_to_dependency_index[cb_state->activeSubpass]];
- const auto &sub_src_stage_mask = sub_dep.srcStageMask;
- const auto &sub_dst_stage_mask = sub_dep.dstStageMask;
- if (src_stage_mask != (sub_src_stage_mask & src_stage_mask)) {
+ const auto &sub_src_stage_mask = ExpandPipelineStageFlags(sub_dep.srcStageMask);
+ const auto &sub_dst_stage_mask = ExpandPipelineStageFlags(sub_dep.dstStageMask);
+ if ((sub_src_stage_mask != VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) &&
+ (src_stage_mask != (sub_src_stage_mask & src_stage_mask))) {
skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
rp_handle, __LINE__, VALIDATION_ERROR_1b80092a, "CORE",
"%s: Barrier srcStageMask(0x%X) is not a subset of VkSubpassDependency srcStageMask(0x%X) of "
@@ -6172,7 +6185,8 @@ static bool ValidateRenderPassPipelineBarriers(layer_data *device_data, const ch
funcName, src_stage_mask, sub_src_stage_mask, cb_state->activeSubpass, rp_handle,
validation_error_map[VALIDATION_ERROR_1b80092a]);
}
- if (dst_stage_mask != (sub_dst_stage_mask & dst_stage_mask)) {
+ if ((sub_dst_stage_mask != VK_PIPELINE_STAGE_ALL_COMMANDS_BIT) &&
+ (dst_stage_mask != (sub_dst_stage_mask & dst_stage_mask))) {
skip |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT,
rp_handle, __LINE__, VALIDATION_ERROR_1b80092c, "CORE",
"%s: Barrier dstStageMask(0x%X) is not a subset of VkSubpassDependency dstStageMask(0x%X) of "