v2: - use VkPhysicalDeviceExternalImageFormatInfoKHR (Fredrik) - use VkExternalImageFormatPropertiesKHR and check for VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR (Fredrik) - pass usage, handle type and the expected feature as args (Fredrik)
CC: Fredrik Hoeglund <fred...@kde.org> Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- tests/spec/ext_memory_object/common.c | 39 ++++++++++++++++++++++++++++++++ tests/spec/ext_memory_object/common.h | 7 ++++++ tests/spec/ext_memory_object/vk_common.c | 15 ++++++++++++ tests/spec/ext_memory_object/vk_common.h | 3 +++ 4 files changed, 64 insertions(+) diff --git a/tests/spec/ext_memory_object/common.c b/tests/spec/ext_memory_object/common.c index b07a8fcb0..246260fae 100644 --- a/tests/spec/ext_memory_object/common.c +++ b/tests/spec/ext_memory_object/common.c @@ -141,3 +141,42 @@ create_tex_from_vk_dev_mem(const struct tex_layout *layout, assert(!"Invalid target"); } } + +bool +is_layout_supported(struct vk_core *core, + const struct vk_image_layout *layout, + VkImageUsageFlagBits usage, + VkExternalMemoryHandleTypeFlagBitsKHR handle_type, + VkExternalMemoryFeatureFlagBitsKHR feature_needed) +{ + const VkPhysicalDeviceExternalImageFormatInfoKHR ext_format_info = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR, + .handleType = handle_type + }; + const VkPhysicalDeviceImageFormatInfo2KHR info = { + .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR, + .pNext = &ext_format_info, + .format = layout->src_format, + .type = vk_get_image_type(layout->h, layout->z), + .tiling = layout->src_tiling, + .usage = usage, + }; + VkExternalImageFormatPropertiesKHR ext_img_prop = { + .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR + }; + VkImageFormatProperties2KHR props = { + .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR, + .pNext = &ext_img_prop, + }; + PFN_vkGetPhysicalDeviceImageFormatProperties2KHR + vk_phys_dev_img_fmt_prop_2_khr = + vk_get_proc_addr_for_phys_dev_image_format_prop( + core->dev); + + if (vk_phys_dev_img_fmt_prop_2_khr( + core->phys_dev, &info, &props) != VK_SUCCESS) + return false; + + return ext_img_prop.externalMemoryProperties.externalMemoryFeatures & + feature_needed; +} diff --git a/tests/spec/ext_memory_object/common.h b/tests/spec/ext_memory_object/common.h index 240c305e8..993e225b9 100644 --- a/tests/spec/ext_memory_object/common.h +++ b/tests/spec/ext_memory_object/common.h @@ -44,4 +44,11 @@ void create_tex_from_vk_dev_mem(const struct tex_layout *layout, GLuint mem_obj, unsigned offset, GLuint *tex); +bool +is_layout_supported(struct vk_core *core, + const struct vk_image_layout *layout, + VkImageUsageFlagBits usage, + VkExternalMemoryHandleTypeFlagBitsKHR handle_type, + VkExternalMemoryFeatureFlagBitsKHR feature_needed); + #endif diff --git a/tests/spec/ext_memory_object/vk_common.c b/tests/spec/ext_memory_object/vk_common.c index f8dea7b6e..5d32d850d 100644 --- a/tests/spec/ext_memory_object/vk_common.c +++ b/tests/spec/ext_memory_object/vk_common.c @@ -598,6 +598,21 @@ vk_get_proc_addr_for_mem_fd(VkDevice dev) return get_fd; } +PFN_vkGetPhysicalDeviceImageFormatProperties2KHR +vk_get_proc_addr_for_phys_dev_image_format_prop(VkDevice dev) +{ + static PFN_vkGetPhysicalDeviceImageFormatProperties2KHR + get_prop = NULL; + + if (get_prop == NULL) + get_prop = (PFN_vkGetPhysicalDeviceImageFormatProperties2KHR) + vkGetDeviceProcAddr( + dev, + "vkGetPhysicalDeviceImageFormatProperties2KHR"); + + return get_prop; +} + void vk_create_simple_pipeline(struct vk_core *core, const struct vk_image_layout *layout, diff --git a/tests/spec/ext_memory_object/vk_common.h b/tests/spec/ext_memory_object/vk_common.h index 0efccf37a..3f1e70255 100644 --- a/tests/spec/ext_memory_object/vk_common.h +++ b/tests/spec/ext_memory_object/vk_common.h @@ -160,6 +160,9 @@ vk_get_proc_addr_for_image_mem_req(VkDevice dev); PFN_vkGetMemoryFdKHR vk_get_proc_addr_for_mem_fd(VkDevice dev); +PFN_vkGetPhysicalDeviceImageFormatProperties2KHR +vk_get_proc_addr_for_phys_dev_image_format_prop(VkDevice dev); + void vk_create_simple_pipeline(struct vk_core *core, const struct vk_image_layout *layout, -- 2.14.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit