| 727 | } |
| 728 | |
| 729 | bool RenderPassAccessContext::ValidateNextSubpass(const CommandBufferAccessContext& cb_context, vvl::Func command) const { |
| 730 | // PHASE1 TODO: Add Validate Preserve attachments |
| 731 | bool skip = false; |
| 732 | skip |= ValidateResolveOperations(cb_context, command); |
| 733 | skip |= ValidateStoreOperation(cb_context, command); |
| 734 | |
| 735 | const auto next_subpass = current_subpass_ + 1; |
| 736 | if (next_subpass >= rp_state_->create_info.subpassCount) { |
| 737 | return skip; |
| 738 | } |
| 739 | const uint32_t next_subpass_view_mask = rp_state_->create_info.pSubpasses[next_subpass].viewMask; |
| 740 | const auto& next_context = subpass_contexts_[next_subpass]; |
| 741 | skip |= ValidateLayoutTransitions(cb_context, next_context, *rp_state_, render_area_, render_pass_instance_id_, next_subpass, |
| 742 | next_subpass_view_mask, attachment_views_, command); |
| 743 | if (!skip) { |
| 744 | // To avoid complex (and buggy) duplication of the affect of layout transitions on load operations, we'll record them |
| 745 | // on a copy of the (empty) next context. |
| 746 | // Note: The resource access map should be empty so hopefully this copy isn't too horrible from a perf POV. |
| 747 | AccessContext temp_context(cb_context.GetSyncState()); |
| 748 | temp_context.InitFrom(next_context); |
| 749 | RecordLayoutTransitions(*rp_state_, next_subpass, attachment_views_, kInvalidTag, temp_context); |
| 750 | skip |= ValidateLoadOperation(cb_context, temp_context, *rp_state_, render_area_, render_pass_instance_id_, next_subpass, |
| 751 | next_subpass_view_mask, attachment_views_, command); |
| 752 | } |
| 753 | return skip; |
| 754 | } |
| 755 | bool RenderPassAccessContext::ValidateEndRenderPass(const CommandBufferAccessContext& cb_context, vvl::Func command) const { |
| 756 | // PHASE1 TODO: Validate Preserve |
| 757 | bool skip = false; |