On 2017-12-21 07:02 AM, Topi Pohjolainen wrote:
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;

Might be able to use piglit_check_gl_error(GL_NO_ERROR) here.

With that changed, patch is
Reviewed-by: Andres Rodriguez <andre...@gmail.com>

+}
+
+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

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to