Skip to content

Commit c363aa3

Browse files
committed
sync: Add initial multiview support
1 parent df62dfa commit c363aa3

7 files changed

Lines changed: 505 additions & 71 deletions

layers/sync/sync_access_context.cpp

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -562,8 +562,8 @@ void AccessContext::UpdateAccessState(ImageRangeGen &range_gen, SyncAccessIndex
562562
}
563563
}
564564

565-
void AccessContext::UpdateAccessState(ImageRangeGen &range_gen, SyncAccessIndex current_usage,
566-
const AttachmentAccess &attachment_access, ResourceUsageTagEx tag_ex) {
565+
void AccessContext::UpdateAttachmentAccessState(ImageRangeGen &range_gen, SyncAccessIndex current_usage,
566+
const AttachmentAccess &attachment_access, ResourceUsageTagEx tag_ex) {
567567
assert(!finalized_);
568568
if (current_usage == SYNC_ACCESS_INDEX_NONE) {
569569
return;
@@ -574,6 +574,25 @@ void AccessContext::UpdateAccessState(ImageRangeGen &range_gen, SyncAccessIndex
574574
}
575575
}
576576

577+
void AccessContext::UpdateAttachmentAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
578+
SyncAccessIndex current_usage, const AttachmentAccess &attachment_access,
579+
ResourceUsageTagEx tag_ex, uint32_t view_mask) {
580+
if (view_mask == 0) {
581+
ImageRangeGen range_gen = view_gen.GetRangeGen(gen_type);
582+
UpdateAttachmentAccessState(range_gen, current_usage, attachment_access, tag_ex);
583+
} else {
584+
uint32_t view_index = 0;
585+
while (view_mask) {
586+
if (view_mask & 1) {
587+
ImageRangeGen range_gen = view_gen.GetRangeGen(gen_type, view_index);
588+
UpdateAttachmentAccessState(range_gen, current_usage, attachment_access, tag_ex);
589+
}
590+
view_mask >>= 1;
591+
view_index++;
592+
}
593+
}
594+
}
595+
577596
void AccessContext::ResolveChildContexts(vvl::span<AccessContext> subpass_contexts) {
578597
assert(!finalized_);
579598

@@ -676,14 +695,27 @@ AttachmentViewGen::AttachmentViewGen(const vvl::ImageView *image_view, const VkO
676695
}
677696
}
678697

679-
const ImageRangeGen &AttachmentViewGen::GetRangeGen(AttachmentViewGen::Gen type) const {
680-
static_assert(Gen::kGenSize == 4, "Function written with this assumption");
681-
// If the view is a depth only view, then the depth only portion of the render area is simply the render area.
682-
// If the view is a depth stencil view, then the depth only portion of the render area will be a subset,
683-
// and thus needs the generator function that will produce the address ranges of that subset
684-
const bool depth_only = (type == kDepthOnlyRenderArea) && vkuFormatIsDepthOnly(view_->create_info.format);
685-
const bool stencil_only = (type == kStencilOnlyRenderArea) && vkuFormatIsStencilOnly(view_->create_info.format);
686-
if (depth_only || stencil_only) {
698+
ImageRangeGen AttachmentViewGen::GetRangeGen(AttachmentViewGen::Gen type, uint32_t view_index) const {
699+
// Restrict image view's subresource range to a specific multiview layer
700+
if (view_index != vvl::kNoIndex32) {
701+
VkImageSubresourceRange subresource = view_->normalized_subresource_range;
702+
if (view_index >= subresource.layerCount) {
703+
return {}; // invalid view index
704+
}
705+
subresource.baseArrayLayer += view_index;
706+
subresource.layerCount = 1;
707+
auto range_gen = SubState(*view_->image_state).MakeImageRangeGen(subresource, view_->is_depth_sliced);
708+
return range_gen;
709+
}
710+
711+
// If a single aspect of depth-stencil attachment is requested, but the attachment actually
712+
// consist of a single aspect, then the render area's range gen is what was requested
713+
// (in this case we also don't cache separate depth/stencil-only range gens).
714+
const bool asked_depth_aspect_for_depth_only =
715+
(type == kDepthOnlyRenderArea) && vkuFormatIsDepthOnly(view_->create_info.format);
716+
const bool asked_stencil_aspect_for_stencil_only =
717+
(type == kStencilOnlyRenderArea) && vkuFormatIsStencilOnly(view_->create_info.format);
718+
if (asked_depth_aspect_for_depth_only || asked_stencil_aspect_for_stencil_only) {
687719
type = Gen::kRenderArea;
688720
}
689721
assert(gen_store_[type].has_value());

layers/sync/sync_access_context.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class AttachmentViewGen {
192192
};
193193
AttachmentViewGen(const vvl::ImageView *image_view, const VkOffset3D &offset, const VkExtent3D &extent);
194194
const vvl::ImageView *GetViewState() const { return view_; }
195-
const ImageRangeGen &GetRangeGen(Gen type) const;
195+
ImageRangeGen GetRangeGen(Gen type, uint32_t view_index = vvl::kNoIndex32) const;
196196
Gen GetDepthStencilRenderAreaGenType(bool depth_op, bool stencil_op) const;
197197

198198
private:
@@ -272,8 +272,11 @@ class AccessContext {
272272
void UpdateAccessState(const vvl::Buffer &buffer, SyncAccessIndex current_usage, const AccessRange &range,
273273
ResourceUsageTagEx tag_ex, SyncFlags flags = 0);
274274
void UpdateAccessState(ImageRangeGen &range_gen, SyncAccessIndex current_usage, ResourceUsageTagEx tag_ex, SyncFlags flags = 0);
275-
void UpdateAccessState(ImageRangeGen &range_gen, SyncAccessIndex current_usage, const AttachmentAccess &attachment_access,
276-
ResourceUsageTagEx tag_ex);
275+
void UpdateAttachmentAccessState(ImageRangeGen &range_gen, SyncAccessIndex current_usage,
276+
const AttachmentAccess &attachment_access, ResourceUsageTagEx tag_ex);
277+
void UpdateAttachmentAccessState(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
278+
SyncAccessIndex current_usage, const AttachmentAccess &attachment_access,
279+
ResourceUsageTagEx tag_ex, uint32_t view_mask = 0);
277280

278281
void ResolveChildContexts(vvl::span<AccessContext> subpass_contexts);
279282

@@ -359,6 +362,9 @@ class AccessContext {
359362

360363
HazardResult DetectAttachmentHazard(ImageRangeGen &range_gen, SyncAccessIndex current_usage,
361364
const AttachmentAccess &attachment_access) const;
365+
HazardResult DetectAttachmentHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
366+
SyncAccessIndex current_usage, const AttachmentAccess &attachment_access,
367+
uint32_t view_mask = 0) const;
362368
HazardResult DetectAttachmentHazard(const vvl::Image &image, const VkImageSubresourceRange &subresource_range,
363369
bool is_depth_sliced, SyncAccessIndex current_usage,
364370
const AttachmentAccess &attachment_access) const;

layers/sync/sync_commandbuffer.cpp

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,8 @@ void CommandBufferAccessContext::RecordBeginRendering(BeginRenderingCmdState &cm
380380
}
381381
ImageRangeGen range_gen = attachment.view_gen;
382382
const AttachmentAccess attachment_access = GetAttachmentAccess(attachment.GetOrdering(), AttachmentAccessType::LoadOp);
383-
GetCurrentAccessContext()->UpdateAccessState(range_gen, load_index, attachment_access, ResourceUsageTagEx{tag});
383+
GetCurrentAccessContext()->UpdateAttachmentAccessState(range_gen, load_index, attachment_access,
384+
ResourceUsageTagEx{tag});
384385
}
385386
}
386387
dynamic_rendering_info_ = std::move(cmd_state.info);
@@ -492,18 +493,19 @@ void CommandBufferAccessContext::RecordEndRendering(const RecordObject &record_o
492493

493494
const AttachmentAccess resolve_read_access = GetAttachmentAccess(kResolveOrder, AttachmentAccessType::ResolveRead);
494495
ImageRangeGen view_gen = attachment.view_gen;
495-
access_context.UpdateAccessState(view_gen, kResolveRead, resolve_read_access, ResourceUsageTagEx{store_tag});
496+
access_context.UpdateAttachmentAccessState(view_gen, kResolveRead, resolve_read_access, ResourceUsageTagEx{store_tag});
496497

497498
const AttachmentAccess resolve_write_access = GetAttachmentAccess(kResolveOrder, AttachmentAccessType::ResolveWrite);
498499
ImageRangeGen resolve_gen = *attachment.resolve_gen;
499-
access_context.UpdateAccessState(resolve_gen, kResolveWrite, resolve_write_access, ResourceUsageTagEx{store_tag});
500+
access_context.UpdateAttachmentAccessState(resolve_gen, kResolveWrite, resolve_write_access,
501+
ResourceUsageTagEx{store_tag});
500502
}
501503

502504
const SyncAccessIndex store_index = attachment.GetStoreUsage();
503505
if (store_index != SYNC_ACCESS_INDEX_NONE) {
504506
const AttachmentAccess attachment_access = GetAttachmentAccess(kStoreOrder, AttachmentAccessType::StoreOp);
505507
ImageRangeGen view_gen = attachment.view_gen;
506-
access_context.UpdateAccessState(view_gen, store_index, attachment_access, ResourceUsageTagEx{store_tag});
508+
access_context.UpdateAttachmentAccessState(view_gen, store_index, attachment_access, ResourceUsageTagEx{store_tag});
507509
}
508510
}
509511
current_render_pass_instance_id_++;
@@ -744,8 +746,8 @@ void CommandBufferAccessContext::RecordDispatchDrawDescriptorSet(VkPipelineBindP
744746
const AttachmentAccess attachment_access = GetAttachmentAccess(SyncOrdering::kRaster);
745747

746748
ImageRangeGen range_gen(MakeImageRangeGen(*img_view_state, offset, extent));
747-
current_context_->UpdateAccessState(range_gen, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ,
748-
attachment_access, tag_ex);
749+
current_context_->UpdateAttachmentAccessState(range_gen, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ,
750+
attachment_access, tag_ex);
749751
} else {
750752
ImageRangeGen range_gen = MakeImageRangeGen(*img_view_state);
751753
current_context_->UpdateAccessState(range_gen, sync_index, tag_ex);
@@ -1020,8 +1022,8 @@ void CommandBufferAccessContext::RecordDrawDynamicRenderingAttachment(ResourceUs
10201022
}
10211023
const AttachmentAccess attachment_access = GetAttachmentAccess(SyncOrdering::kColorAttachment);
10221024
ImageRangeGen view_gen = attachment.view_gen;
1023-
access_context.UpdateAccessState(view_gen, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, attachment_access,
1024-
ResourceUsageTagEx{tag});
1025+
access_context.UpdateAttachmentAccessState(view_gen, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, attachment_access,
1026+
ResourceUsageTagEx{tag});
10251027
}
10261028

10271029
// TODO -- fixup this and Subpass attachment to correct map the various depth stencil enables/reads vs. writes
@@ -1037,8 +1039,8 @@ void CommandBufferAccessContext::RecordDrawDynamicRenderingAttachment(ResourceUs
10371039
if (writeable) {
10381040
const AttachmentAccess attachment_access = GetAttachmentAccess(SyncOrdering::kDepthStencilAttachment);
10391041
ImageRangeGen view_gen = attachment.view_gen;
1040-
access_context.UpdateAccessState(view_gen, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, attachment_access,
1041-
ResourceUsageTagEx{tag});
1042+
access_context.UpdateAttachmentAccessState(view_gen, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
1043+
attachment_access, ResourceUsageTagEx{tag});
10421044
}
10431045
}
10441046
}
@@ -1210,13 +1212,13 @@ void CommandBufferAccessContext::RecordClearAttachment(ResourceUsageTag tag, con
12101212
if (aspects_to_clear & kColorAspects) {
12111213
assert((aspects_to_clear & kDepthStencilAspects) == 0);
12121214
const AttachmentAccess attachment_access = GetAttachmentAccess(SyncOrdering::kColorAttachment);
1213-
current_context_->UpdateAccessState(range_gen, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, attachment_access,
1214-
ResourceUsageTagEx{tag});
1215+
current_context_->UpdateAttachmentAccessState(range_gen, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE,
1216+
attachment_access, ResourceUsageTagEx{tag});
12151217
} else {
12161218
assert((aspects_to_clear & kColorAspects) == 0);
12171219
const AttachmentAccess attachment_access = GetAttachmentAccess(SyncOrdering::kDepthStencilAttachment);
1218-
current_context_->UpdateAccessState(range_gen, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, attachment_access,
1219-
ResourceUsageTagEx{tag});
1220+
current_context_->UpdateAttachmentAccessState(range_gen, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
1221+
attachment_access, ResourceUsageTagEx{tag});
12201222
}
12211223
}
12221224

layers/sync/sync_hazard_detection.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,29 @@ HazardResult AccessContext::DetectAttachmentHazard(ImageRangeGen &range_gen, Syn
352352
return DetectHazardGeneratedRangeGen(detector, range_gen, DetectOptions::kDetectAll);
353353
}
354354

355+
HazardResult AccessContext::DetectAttachmentHazard(const AttachmentViewGen &view_gen, AttachmentViewGen::Gen gen_type,
356+
SyncAccessIndex current_usage, const AttachmentAccess &attachment_access,
357+
uint32_t view_mask) const {
358+
if (view_mask == 0) {
359+
ImageRangeGen range_gen = view_gen.GetRangeGen(gen_type);
360+
return DetectAttachmentHazard(range_gen, current_usage, attachment_access);
361+
} else {
362+
uint32_t view_index = 0;
363+
while (view_mask) {
364+
if (view_mask & 1) {
365+
ImageRangeGen range_gen = view_gen.GetRangeGen(gen_type, view_index);
366+
auto hazard = DetectAttachmentHazard(range_gen, current_usage, attachment_access);
367+
if (hazard.IsHazard()) {
368+
return hazard;
369+
}
370+
}
371+
view_mask >>= 1;
372+
view_index++;
373+
}
374+
return {};
375+
}
376+
}
377+
355378
HazardResult AccessContext::DetectAttachmentHazard(const vvl::Image &image, const VkImageSubresourceRange &subresource_range,
356379
bool is_depth_sliced, SyncAccessIndex current_usage,
357380
const AttachmentAccess &attachment_access) const {
@@ -393,8 +416,7 @@ HazardResult AccessContext::DetectImageBarrierHazard(const AttachmentViewGen &vi
393416
DetectOptions options) const {
394417
BarrierHazardDetector detector(*this, SyncAccessIndex::SYNC_IMAGE_LAYOUT_TRANSITION, barrier.src_exec_scope.exec_scope,
395418
barrier.src_access_scope);
396-
const std::optional<ImageRangeGen> &attachment_gen = view_gen.GetRangeGen(AttachmentViewGen::Gen::kViewSubresource);
397-
subresource_adapter::ImageRangeGenerator range_gen(*attachment_gen);
419+
ImageRangeGen range_gen = view_gen.GetRangeGen(AttachmentViewGen::Gen::kViewSubresource);
398420
return DetectHazardGeneratedRangeGen(detector, range_gen, options);
399421
}
400422

0 commit comments

Comments
 (0)