Skip to content

Commit a51e062

Browse files
spirv-val: Allow compare-exchange semantics equal=Release and unequal=Acquire (KhronosGroup#6286)
Signed-off-by: Natalia Gavrilenko <[email protected]>
1 parent 392b489 commit a51e062

File tree

2 files changed

+22
-50
lines changed

2 files changed

+22
-50
lines changed

source/val/validate_memory_semantics.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,12 @@ spv_result_t ValidateMemorySemantics(ValidationState_t& _,
219219

220220
const auto equal_mask_seq_cst =
221221
uint32_t(spv::MemorySemanticsMask::SequentiallyConsistent);
222-
const auto equal_mask_acquire =
223-
uint32_t(spv::MemorySemanticsMask::SequentiallyConsistent |
224-
spv::MemorySemanticsMask::AcquireRelease |
225-
spv::MemorySemanticsMask::Acquire);
222+
const auto equal_mask_acquire = uint32_t(
223+
// Allow EqualMemorySemantics Release with UnequalMemorySemantics
224+
// Acquire, since the C standard doesn't clearly forbid it.
225+
spv::MemorySemanticsMask::SequentiallyConsistent |
226+
spv::MemorySemanticsMask::AcquireRelease |
227+
spv::MemorySemanticsMask::Release | spv::MemorySemanticsMask::Acquire);
226228

227229
if (((value & uint32_t(spv::MemorySemanticsMask::SequentiallyConsistent)) &&
228230
!(equal_value & equal_mask_seq_cst)) ||

test/val/val_memory_semantics_test.cpp

Lines changed: 16 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ INSTANTIATE_TEST_SUITE_P(
481481
Values(OpControlBarrier, OpMemoryBarrier), Values(TestResult())));
482482

483483
INSTANTIATE_TEST_SUITE_P(
484-
ErrorMemoryOrderTooWeakRelaxed, VulkanUnequalMemorySemantics,
484+
ErrorMemoryOrderTooWeak, VulkanUnequalMemorySemantics,
485485
Combine(Values(None), Values(None), Values(None),
486486
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
487487
Values(Acquire),
@@ -497,50 +497,15 @@ INSTANTIATE_TEST_SUITE_P(
497497
"stronger memory order than the corresponding Equal Memory "
498498
"Semantics"))));
499499

500-
INSTANTIATE_TEST_SUITE_P(
501-
ErrorMemoryOrderTooWeakRelease, VulkanUnequalMemorySemantics,
502-
Combine(Values(Release),
503-
Values(Uniform, Workgroup, Image, Output,
504-
Uniform | Workgroup | Image | Output),
505-
Values(None, Available),
506-
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
507-
Values(Acquire),
508-
Values(Uniform, Workgroup, Image, Output,
509-
Uniform | Workgroup | Image | Output),
510-
Values(None, Visible),
511-
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
512-
Values(true, false), Values(None, Volatile),
513-
Values(TestResult(
514-
SPV_ERROR_INVALID_DATA,
515-
"VUID-StandaloneSpirv-UnequalMemorySemantics-10876",
516-
"AtomicCompareExchange Unequal Memory Semantics must not use a "
517-
"stronger memory order than the corresponding Equal Memory "
518-
"Semantics"))));
519-
520500
INSTANTIATE_TEST_SUITE_P(
521501
ErrorMissingStorageClassSemanticsFlags, VulkanUnequalMemorySemantics,
522502
Combine(
523-
Values(Acquire, AcqRel, AcqRel | Available),
524-
Values(Uniform | Workgroup), Values(None, Visible),
525-
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
526-
Values(Acquire), Values(Uniform | Image, Output), Values(None),
527-
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
528-
Values(true, false), Values(None, Volatile),
529-
Values(TestResult(
530-
SPV_ERROR_INVALID_DATA,
531-
"VUID-StandaloneSpirv-UnequalMemorySemantics-10877",
532-
"AtomicCompareExchange Unequal Memory Semantics must not have any "
533-
"Vulkan-supported storage class semantics bit set (UniformMemory, "
534-
"WorkgroupMemory, ImageMemory, or OutputMemory) unless this bit is "
535-
"also set in the corresponding Equal Memory Semantics"))));
536-
537-
INSTANTIATE_TEST_SUITE_P(
538-
ErrorMissingStorageClassSemanticsFlagsVisible, VulkanUnequalMemorySemantics,
539-
Combine(
540-
Values(Acquire, AcqRel, AcqRel | Available),
541-
Values(Uniform | Workgroup), Values(Visible),
503+
Values(Acquire, Acquire | Visible, Release, Release | Available, AcqRel,
504+
AcqRel | Visible, AcqRel | Available,
505+
AcqRel | Available | Visible),
506+
Values(Uniform | Workgroup), Values(None),
542507
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
543-
Values(Acquire), Values(Uniform | Image, Output), Values(Visible),
508+
Values(Acquire), Values(Uniform | Image, Output), Values(None, Visible),
544509
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
545510
Values(true, false), Values(None, Volatile),
546511
Values(TestResult(
@@ -553,7 +518,8 @@ INSTANTIATE_TEST_SUITE_P(
553518

554519
INSTANTIATE_TEST_SUITE_P(
555520
ErrorMissingMakeVisibleFlag, VulkanUnequalMemorySemantics,
556-
Combine(Values(Acquire, AcqRel, AcqRel | Available),
521+
Combine(Values(Acquire, Release, Release | Available, AcqRel,
522+
AcqRel | Available),
557523
Values(Uniform | Workgroup | Image | Output), Values(None),
558524
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
559525
Values(Acquire),
@@ -609,8 +575,10 @@ INSTANTIATE_TEST_SUITE_P(
609575
ErrorMismatchingVolatileFlagsNonRelaxedAndAcquire,
610576
VulkanUnequalMemorySemantics,
611577
Combine(
612-
Values(Acquire, AcqRel, AcqRel | Available),
613-
Values(Uniform | Workgroup | Image | Output), Values(None, Visible),
578+
Values(Acquire, Acquire | Visible, Release, Release | Available, AcqRel,
579+
AcqRel | Visible, AcqRel | Available,
580+
AcqRel | Available | Visible),
581+
Values(Uniform | Workgroup | Image | Output), Values(None),
614582
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
615583
Values(Acquire),
616584
Values(Uniform, Workgroup, Image, Output,
@@ -646,8 +614,10 @@ INSTANTIATE_TEST_SUITE_P(
646614

647615
INSTANTIATE_TEST_SUITE_P(
648616
SuccessNonRelaxedAndAcquire, VulkanUnequalMemorySemantics,
649-
Combine(Values(Acquire, AcqRel, AcqRel | Available),
650-
Values(Uniform | Workgroup | Image | Output), Values(None, Visible),
617+
Combine(Values(Acquire, Acquire | Visible, Release, Release | Available,
618+
AcqRel, AcqRel | Visible, AcqRel | Available,
619+
AcqRel | Available | Visible),
620+
Values(Uniform | Workgroup | Image | Output), Values(None),
651621
Values(None, Subgroup | CrossWorkgroup | AtomicCounter),
652622
Values(Acquire),
653623
Values(Uniform, Workgroup, Image, Output,

0 commit comments

Comments
 (0)