aboutsummaryrefslogtreecommitdiff
path: root/layers/buffer_validation.cpp
diff options
context:
space:
mode:
authorChris Forbes <chrisforbes@google.com>2017-08-21 11:27:08 -0700
committerjzulauf-lunarg <32470354+jzulauf-lunarg@users.noreply.github.com>2018-03-30 08:44:28 -0600
commitccc29e05c0c4ba36e81ec6fee5d48ce489d80d12 (patch)
tree064c21aaef20bc91175723e2e6f8119e44f15a85 /layers/buffer_validation.cpp
parent5c447e7b228008258cdbf79dc4f9b2a5b9e6b3e4 (diff)
downloadusermoji-ccc29e05c0c4ba36e81ec6fee5d48ce489d80d12.tar.xz
layers: Skip layout transition in release op
Diffstat (limited to 'layers/buffer_validation.cpp')
-rw-r--r--layers/buffer_validation.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 77be373b..48212e1a 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -572,12 +572,31 @@ bool ValidateBarriersToImages(layer_data *device_data, GLOBAL_CB_NODE const *cb_
return skip;
}
+static bool IsReleaseOp(layer_data *device_data, GLOBAL_CB_NODE *cb_state, VkImageMemoryBarrier const *barrier) {
+ if (barrier->srcQueueFamilyIndex == barrier->dstQueueFamilyIndex)
+ return false;
+
+ auto pool = GetCommandPoolNode(device_data, cb_state->createInfo.commandPool);
+ return pool->queueFamilyIndex == barrier->srcQueueFamilyIndex;
+}
+
void TransitionImageLayouts(layer_data *device_data, GLOBAL_CB_NODE *cb_state, uint32_t memBarrierCount,
const VkImageMemoryBarrier *pImgMemBarriers) {
for (uint32_t i = 0; i < memBarrierCount; ++i) {
auto mem_barrier = &pImgMemBarriers[i];
if (!mem_barrier) continue;
+ // For ownership transfers, the barrier is specified twice; as a release
+ // operation on the yielding queue family, and as an acquire operation
+ // on the acquiring queue family. This barrier may also include a layout
+ // transition, which occurs 'between' the two operations. For validation
+ // purposes it doesn't seem important which side performs the layout
+ // transition, but it must not be performed twice. We'll arbitrarily
+ // choose to perform it as part of the acquire operation.
+ if (IsReleaseOp(device_data, cb_state, mem_barrier)) {
+ continue;
+ }
+
VkImageCreateInfo *image_create_info = &(GetImageState(device_data, mem_barrier->image)->createInfo);
uint32_t level_count = ResolveRemainingLevels(&mem_barrier->subresourceRange, image_create_info->mipLevels);
uint32_t layer_count = ResolveRemainingLayers(&mem_barrier->subresourceRange, image_create_info->arrayLayers);