1/*
2 * Copyright 2020 Valve Corporation
3 * SPDX-License-Identifier: MIT
4 *
5 * Authors:
6 *    Jonathan Marek <jonathan@marek.ca>
7 */
8
9#include <vulkan/vulkan.h>
10#include <vulkan/vk_android_native_buffer.h> /* android tu_entrypoints.h depends on this */
11#include <assert.h>
12
13#include "tu_entrypoints.h"
14#include "vk_util.h"
15
16VKAPI_ATTR void VKAPI_CALL
17tu_GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice pdev,
18                                          uint32_t *count,
19                                          VkQueueFamilyProperties *props)
20{
21   if (!props)
22      return tu_GetPhysicalDeviceQueueFamilyProperties2(pdev, count, NULL);
23
24   VkQueueFamilyProperties2 props2[*count];
25   for (uint32_t i = 0; i < *count; i++) {
26      props2[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
27      props2[i].pNext = NULL;
28   }
29   tu_GetPhysicalDeviceQueueFamilyProperties2(pdev, count, props2);
30   for (uint32_t i = 0; i < *count; i++)
31      props[i] = props2[i].queueFamilyProperties;
32}
33
34VKAPI_ATTR void VKAPI_CALL
35tu_GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice pdev,
36                                                VkFormat format,
37                                                VkImageType type,
38                                                VkSampleCountFlagBits samples,
39                                                VkImageUsageFlags usage,
40                                                VkImageTiling tiling,
41                                                uint32_t *count,
42                                                VkSparseImageFormatProperties *props)
43{
44   const VkPhysicalDeviceSparseImageFormatInfo2 info = {
45      .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
46      .format = format,
47      .type = type,
48      .samples = samples,
49      .usage = usage,
50      .tiling = tiling,
51   };
52
53   if (!props)
54      return tu_GetPhysicalDeviceSparseImageFormatProperties2(pdev, &info, count, NULL);
55
56   VkSparseImageFormatProperties2 props2[*count];
57   for (uint32_t i = 0; i < *count; i++) {
58      props2[i].sType = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2;
59      props2[i].pNext = NULL;
60   }
61   tu_GetPhysicalDeviceSparseImageFormatProperties2(pdev, &info, count, props2);
62   for (uint32_t i = 0; i < *count; i++)
63      props[i] = props2[i].properties;
64}
65
66VKAPI_ATTR void VKAPI_CALL
67tu_GetImageSparseMemoryRequirements(VkDevice device,
68                                    VkImage image,
69                                    uint32_t *count,
70                                    VkSparseImageMemoryRequirements *reqs)
71{
72   const VkImageSparseMemoryRequirementsInfo2 info = {
73      .sType = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
74      .image = image
75   };
76
77   if (!reqs)
78      return tu_GetImageSparseMemoryRequirements2(device, &info, count, NULL);
79
80   VkSparseImageMemoryRequirements2 reqs2[*count];
81   for (uint32_t i = 0; i < *count; i++) {
82      reqs2[i].sType = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2;
83      reqs2[i].pNext = NULL;
84   }
85   tu_GetImageSparseMemoryRequirements2(device, &info, count, reqs2);
86   for (uint32_t i = 0; i < *count; i++)
87      reqs[i] = reqs2[i].memoryRequirements;
88}
89