On 2017-12-18 08:17 AM, Topi Pohjolainen wrote:
Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com>
---
  tests/spec/ext_memory_object/vk_common.c | 245 +++++++++++++++++++++++++++++++
  tests/spec/ext_memory_object/vk_common.h |  38 +++++
  2 files changed, 283 insertions(+)
  create mode 100644 tests/spec/ext_memory_object/vk_common.c
  create mode 100644 tests/spec/ext_memory_object/vk_common.h

diff --git a/tests/spec/ext_memory_object/vk_common.c 
b/tests/spec/ext_memory_object/vk_common.c
new file mode 100644
index 000000000..ab871d501
--- /dev/null
+++ b/tests/spec/ext_memory_object/vk_common.c
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include "vk_common.h"
+#include "piglit-util-gl.h"
+
+static VkInstance inst = VK_NULL_HANDLE;
+static VkPhysicalDevice phys_dev = VK_NULL_HANDLE;
+static VkDevice dev = VK_NULL_HANDLE;
+static VkPipelineCache pipeline_cache = VK_NULL_HANDLE;
+static VkCommandPool cmd_pool = VK_NULL_HANDLE;
+static VkCommandBuffer cmd_buf = VK_NULL_HANDLE;
+static VkQueue queue = VK_NULL_HANDLE;
+

Since these variables are file scope consider giving them names that are less likely to alias with local variables (which happens a lot in this file, even with variables of different types!).

Not sure if there is any specific naming convention in piglit, but full names + the 's' prefix would probably be okay. E.g. sInstance, sPhysDevice, sDevice, etc.


+static void *
+test_vk_alloc(void *user_data, size_t size, size_t alignment,
+              VkSystemAllocationScope scope)
+{
+       assert(user_data == (void *)0xdeadbeef);
+       void *mem = malloc(size);
+       memset(mem, 139, size);

Might want to document why 139 is used here, is just to poison the memory to test for bad usage?


+       return mem;
+}
+
+static void *
+test_vk_realloc(void *user_data, void *orig, size_t size,
+                size_t alignment, VkSystemAllocationScope scope)
+{
+       assert(user_data == (void *)0xdeadbeef);
+       return realloc(orig, size);
+}
+
+static void
+test_vk_free(void *user_data, void *mem)
+{
+       assert(user_data == (void *)0xdeadbeef);
+       free(mem);
+}
+
+static void
+test_vk_dummy_notify(void *user_ata, size_t size,
+                     VkInternalAllocationType allocation_type,
+                     VkSystemAllocationScope allocation_scope)
+{
+}
+
+static const VkAllocationCallbacks test_alloc_cb = {
+       .pUserData = (void *)0xdeadbeef,
+       .pfnAllocation = test_vk_alloc,
+       .pfnReallocation = test_vk_realloc,
+       .pfnFree = test_vk_free,
+       .pfnInternalAllocation = test_vk_dummy_notify,
+       .pfnInternalFree = test_vk_dummy_notify
+};
+
+static VkInstance
+create_vk_instance(void)
+{
+       const VkInstanceCreateInfo info = {
+               .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+               .pApplicationInfo = &(VkApplicationInfo) {
+                       .pApplicationName = "piglit_vk_renderer",
+                       .apiVersion = VK_MAKE_VERSION(1, 0, 0), > +          },
+       };
+
+       VkInstance inst = VK_NULL_HANDLE;
+       if (vkCreateInstance(&info, &test_alloc_cb, &inst) != VK_SUCCESS)
+               inst = VK_NULL_HANDLE;
+
+       return inst;
+}
+
+static VkPhysicalDevice
+create_vk_phys_dev(VkInstance inst)
+{
+       unsigned count = 0;
+       VkPhysicalDevice dev = VK_NULL_HANDLE > +
+       if (vkEnumeratePhysicalDevices(inst, &count, NULL) != VK_SUCCESS ||
+           count == 0)
+               return VK_NULL_HANDLE;
+
+       count = 1;
+       if (vkEnumeratePhysicalDevices(inst, &count, &dev) != VK_SUCCESS ||
+           count != 1) > +          dev = VK_NULL_HANDLE;
+

This should be simple to adapt to handle cases with more than one physical device. An array can be allocated dynamically of size count and you just return array[0].

+       return dev;
+}
+
+static VkDevice
+create_vk_device(VkPhysicalDevice phys_dev)
+{
+       const VkDeviceCreateInfo info = {
+               .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
+               .queueCreateInfoCount = 1,
+               .pQueueCreateInfos = &(VkDeviceQueueCreateInfo) {
+                       .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
+                       .queueFamilyIndex = 0,
+                       .queueCount = 1,
+                       .pQueuePriorities = (float[]) {1.0f},
+               },
+       };
+        VkDevice dev = VK_NULL_HANDLE;
+
+       if (vkCreateDevice(phys_dev, &info, NULL, &dev) != VK_SUCCESS)
+               dev = VK_NULL_HANDLE;
+
+       return dev;
+}
+
+static VkPipelineCache
+vk_create_pipeline_cache(VkDevice dev)
+{
+       const VkPipelineCacheCreateInfo info = {
+               .sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO
+       };
+       VkPipelineCache cache = VK_NULL_HANDLE;
+
+       if (vkCreatePipelineCache(dev, &info, NULL, &cache) != VK_SUCCESS)
+               cache = VK_NULL_HANDLE;
+
+       return cache;
+}
+
+static VkCommandPool
+vk_create_cmd_pool(VkDevice dev)
+{
+       const VkCommandPoolCreateInfo info = {
+               .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
+               .queueFamilyIndex = 0,
+               .flags = 0,
+       };
+       VkCommandPool pool = VK_NULL_HANDLE;
+
+       if (vkCreateCommandPool(dev, &info, NULL, &pool) != VK_SUCCESS)
+               pool = VK_NULL_HANDLE;
+
+       return pool;
+}
+
+static VkCommandBuffer
+vk_create_cmd_buffer(VkDevice dev, VkCommandPool pool)
+{
+       const VkCommandBufferAllocateInfo alloc_info = {
+               .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+               .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+               .commandBufferCount = 1,
+               .commandPool = pool,
+       };
+       const VkCommandBufferBeginInfo begin_info = {
+               .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
+       };
+       VkCommandBuffer buf = VK_NULL_HANDLE;
+
+       if (vkAllocateCommandBuffers(dev, &alloc_info, &buf) != VK_SUCCESS)
+               return VK_NULL_HANDLE;
+
+        if (vkBeginCommandBuffer(buf, &begin_info) != VK_SUCCESS) {

Is the indentation here slightly off?

+               vkFreeCommandBuffers(dev, pool, 1, &buf);
+               buf = VK_NULL_HANDLE;
+       }
+
+       return buf;
+}
+
+VkDevice
+vk_init(void)
+{
+        /* Consider if Vulkan stack is already initialised. */

Slightly off indent here too.

+       if (dev != VK_NULL_HANDLE)
+               return dev;
+
+       inst = create_vk_instance();
+       if (inst == VK_NULL_HANDLE)
+               piglit_report_result(PIGLIT_FAIL);
+
+       phys_dev = create_vk_phys_dev(inst);
+       if (phys_dev == VK_NULL_HANDLE)
+               goto fail;
+
+       dev = create_vk_device(phys_dev);
+       if (dev == VK_NULL_HANDLE)
+               goto fail;
+
+       pipeline_cache = vk_create_pipeline_cache(dev);
+       if (pipeline_cache == VK_NULL_HANDLE)
+               goto fail;
+
+       cmd_pool = vk_create_cmd_pool(dev);
+       if (cmd_pool == VK_NULL_HANDLE)
+               goto fail;
+
+       cmd_buf = vk_create_cmd_buffer(dev, cmd_pool);
+       if (cmd_buf == VK_NULL_HANDLE)
+               goto fail;
+
+       vkGetDeviceQueue(dev, 0, 0, &queue);
+
+       return dev;
+
+fail:
+       vk_cleanup();
+       piglit_report_result(PIGLIT_FAIL);
+}
+
+void
+vk_cleanup(void)
+{
+       if (cmd_buf != VK_NULL_HANDLE)
+               vkFreeCommandBuffers(dev, cmd_pool, 1, &cmd_buf);
+
+       if (cmd_pool != VK_NULL_HANDLE)
+               vkDestroyCommandPool(dev, cmd_pool, NULL);
+
+       if (pipeline_cache != VK_NULL_HANDLE)
+               vkDestroyPipelineCache(dev, pipeline_cache, NULL);
+
+       if (dev != VK_NULL_HANDLE)
+               vkDestroyDevice(dev, &test_alloc_cb);
+
+       if (inst != VK_NULL_HANDLE)
+               vkDestroyInstance(inst, &test_alloc_cb);
+}
diff --git a/tests/spec/ext_memory_object/vk_common.h 
b/tests/spec/ext_memory_object/vk_common.h
new file mode 100644
index 000000000..8ddf9c8be
--- /dev/null
+++ b/tests/spec/ext_memory_object/vk_common.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef VK_COMMON_H
+#define VK_COMMON_H
+
+#include <stdbool.h>
+
+#define VK_PROTOTYPES
+#include <vulkan/vulkan.h>
+
+VkDevice
+vk_init(void);
+
+void
+vk_cleanup(void);
+
+#endif

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

Reply via email to