vkimagememory: fix the memory barrier access masks
authorMatthew Waters <matthew@centricular.com>
Wed, 30 Dec 2015 04:15:40 +0000 (15:15 +1100)
committerMatthew Waters <matthew@centricular.com>
Tue, 16 Feb 2016 14:13:43 +0000 (01:13 +1100)
silences the following warnings from the validation layer

AccessMask xxx must have required access bit xxx and may have optional bits 0
when layout is VK_IMAGE_LAYOUT_TRANSFER_{SRC,DST}_OPTIMAL

ext/vulkan/vkimagememory.c

index 3fd1cc8d0a1d77421e7dfc381753162f09ae0e8f..178f9f7697b41211fa4f6cffb6648a8fb96c4f63 100644 (file)
@@ -423,6 +423,27 @@ _vk_image_mem_free (GstAllocator * allocator, GstMemory * memory)
   gst_object_unref (mem->device);
 }
 
+static VkAccessFlags
+_access_flags_from_layout (VkImageLayout image_layout)
+{
+  if (image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
+    return VK_ACCESS_TRANSFER_WRITE_BIT;
+
+  if (image_layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
+    return VK_ACCESS_TRANSFER_READ_BIT;
+
+  if (image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
+    return VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+
+  if (image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL)
+    return VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+
+  if (image_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
+    return VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
+
+  return 0;
+}
+
 gboolean
 gst_vulkan_image_memory_set_layout (GstVulkanImageMemory * vk_mem,
     VkImageLayout image_layout, VkImageMemoryBarrier * barrier)
@@ -431,31 +452,14 @@ gst_vulkan_image_memory_set_layout (GstVulkanImageMemory * vk_mem,
 
   barrier->sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
   barrier->pNext = NULL;
-  barrier->dstAccessMask = 0;
-  barrier->srcAccessMask = 0;
+  barrier->dstAccessMask = _access_flags_from_layout (image_layout);
+  barrier->srcAccessMask = _access_flags_from_layout (vk_mem->image_layout);
   barrier->oldLayout = vk_mem->image_layout;
   barrier->newLayout = image_layout;
   barrier->image = vk_mem->image;
   GST_VK_IMAGE_SUBRESOURCE_RANGE (barrier->subresourceRange,
       VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1);
 
-  if (image_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) {
-    barrier->dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
-  }
-
-  if (image_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
-    barrier->dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
-  }
-
-  if (image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) {
-    barrier->dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
-  }
-
-  if (image_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
-    barrier->dstAccessMask =
-        VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
-  }
-
   /* FIXME: what if the barrier is never submitted or is submitted out of order? */
   vk_mem->image_layout = image_layout;