v2: - s/get_fd/vk_get_memory_fd/ (Andres) - check for glImportMemoryFdEXT() failure (Andres)
Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- tests/spec/ext_memory_object/common.c | 72 ++++++++++++++++++++++++++++++++ tests/spec/ext_memory_object/common.h | 8 ++++ tests/spec/ext_memory_object/vk_common.c | 12 ++++++ tests/spec/ext_memory_object/vk_common.h | 3 ++ 4 files changed, 95 insertions(+) diff --git a/tests/spec/ext_memory_object/common.c b/tests/spec/ext_memory_object/common.c index c274f14df..2a7c0ba31 100644 --- a/tests/spec/ext_memory_object/common.c +++ b/tests/spec/ext_memory_object/common.c @@ -69,3 +69,75 @@ parse_tex_layout(const char **args, unsigned num_args, layout->layout.first_layer = read_unsigned(args[10], usage_prefix); layout->layout.num_layers = read_unsigned(args[11], usage_prefix); } + +bool +create_mem_obj_for_vk_dev_mem(VkDevice dev, VkDeviceMemory mem, + uint64_t size, GLuint *mem_obj) +{ + PFN_vkGetMemoryFdKHR vk_get_memory_fd = + vk_get_proc_addr_for_mem_fd(dev); + const VkMemoryGetFdInfoKHR info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, + .memory = mem, + .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR + }; + int fd; + + assert(vk_get_memory_fd); + if (vk_get_memory_fd(dev, &info, &fd) != VK_SUCCESS) + return false; + + glCreateMemoryObjectsEXT(1, mem_obj); + + glImportMemoryFdEXT(*mem_obj, size, GL_HANDLE_TYPE_OPAQUE_FD_EXT, fd); + + return glGetError() == GL_NO_ERROR; +} + +void +create_tex_from_vk_dev_mem(const struct tex_layout *layout, + GLuint mem_obj, unsigned offset, GLuint *tex) +{ + assert(layout->layout.num_samples == 1); + + glGenTextures(1, tex); + glBindTexture(layout->target, *tex); + + switch (layout->target) { + case GL_TEXTURE_1D: + assert(layout->layout.z == 1); + assert(layout->layout.h == 1); + glTexStorageMem1DEXT( + layout->target, layout->layout.num_levels, + layout->format, layout->layout.w, mem_obj, offset); + break; + case GL_TEXTURE_1D_ARRAY: + assert(layout->layout.z == 1); + assert(layout->layout.h == 1); + glTexStorageMem2DEXT( + layout->target, layout->layout.num_levels, + layout->format, layout->layout.w, + layout->layout.num_layers, mem_obj, offset); + case GL_TEXTURE_2D: + assert(layout->layout.z == 1); + glTexStorageMem2DEXT( + layout->target, layout->layout.num_levels, + layout->format, layout->layout.w, layout->layout.h, + mem_obj, offset); + break; + case GL_TEXTURE_2D_ARRAY: + assert(layout->layout.z == 1); + glTexStorageMem3DEXT( + layout->target, layout->layout.num_levels, + layout->format, layout->layout.w, layout->layout.h, + layout->layout.num_layers, mem_obj, offset); + case GL_TEXTURE_3D: + glTexStorageMem3DEXT( + layout->target, layout->layout.num_levels, + layout->format, layout->layout.w, layout->layout.h, + layout->layout.z, mem_obj, offset); + break; + default: + assert(!"Invalid target"); + } +} diff --git a/tests/spec/ext_memory_object/common.h b/tests/spec/ext_memory_object/common.h index 69ebb3f4a..240c305e8 100644 --- a/tests/spec/ext_memory_object/common.h +++ b/tests/spec/ext_memory_object/common.h @@ -36,4 +36,12 @@ void parse_tex_layout(const char **args, unsigned num_args, const char *usage_prefix, struct tex_layout *layout); +bool +create_mem_obj_for_vk_dev_mem(VkDevice dev, VkDeviceMemory mem, + uint64_t size, GLuint *mem_obj); + +void +create_tex_from_vk_dev_mem(const struct tex_layout *layout, + GLuint mem_obj, unsigned offset, GLuint *tex); + #endif diff --git a/tests/spec/ext_memory_object/vk_common.c b/tests/spec/ext_memory_object/vk_common.c index eaecdf8cd..6e6458ce4 100644 --- a/tests/spec/ext_memory_object/vk_common.c +++ b/tests/spec/ext_memory_object/vk_common.c @@ -583,3 +583,15 @@ vk_get_proc_addr_for_image_mem_req(VkDevice dev) return get_mem_req; } + +PFN_vkGetMemoryFdKHR +vk_get_proc_addr_for_mem_fd(VkDevice dev) +{ + static PFN_vkGetMemoryFdKHR get_fd = NULL; + + if (get_fd == NULL) + get_fd = (PFN_vkGetMemoryFdKHR)vkGetDeviceProcAddr( + dev, "vkGetMemoryFdKHR"); + + return get_fd; +} diff --git a/tests/spec/ext_memory_object/vk_common.h b/tests/spec/ext_memory_object/vk_common.h index b092b142f..db4bbf20f 100644 --- a/tests/spec/ext_memory_object/vk_common.h +++ b/tests/spec/ext_memory_object/vk_common.h @@ -150,4 +150,7 @@ vk_create_fence(VkDevice dev); PFN_vkGetImageMemoryRequirements2KHR vk_get_proc_addr_for_image_mem_req(VkDevice dev); +PFN_vkGetMemoryFdKHR +vk_get_proc_addr_for_mem_fd(VkDevice dev); + #endif -- 2.14.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit