drmDevicePtr drm_device)
{
const char *path = drm_device->nodes[DRM_NODE_RENDER];
- VkResult result;
+ VkResult result = VK_SUCCESS;
drmVersionPtr version;
int fd;
int master_fd = -1;
return vk_error(instance, VK_ERROR_INCOMPATIBLE_DRIVER);
}
+ /* Version 1.3 added MSM_INFO_IOVA. */
+ const int min_version_major = 1;
+ const int min_version_minor = 3;
+
version = drmGetVersion(fd);
if (!version) {
close(fd);
return VK_ERROR_INCOMPATIBLE_DRIVER;
}
+
+ if (version->version_major != 1 || version->version_minor < 3) {
+ result = vk_errorf(instance, VK_ERROR_INCOMPATIBLE_DRIVER,
+ "kernel driver for device %s has version %d.%d, "
+ "but Vulkan requires version >= %d.%d",
+ path,
+ version->version_major, version->version_minor,
+ min_version_major, min_version_minor);
+ drmFreeVersion(version);
+ close(fd);
+ return result;
+ }
+
drmFreeVersion(version);
if (instance->debug_flags & TU_DEBUG_STARTUP)
result = tu_physical_device_init(instance->physical_devices +
instance->physical_device_count,
- instance,
- devices[i]);
+ instance,
+ devices[i]);
if (result == VK_SUCCESS)
++instance->physical_device_count;
else if (result != VK_ERROR_INCOMPATIBLE_DRIVER)
VkPhysicalDevice *pPhysicalDevices)
{
TU_FROM_HANDLE(tu_instance, instance, _instance);
+ VK_OUTARRAY_MAKE(out, pPhysicalDevices, pPhysicalDeviceCount);
+
VkResult result;
if (instance->physical_device_count < 0) {
return result;
}
- if (!pPhysicalDevices) {
- *pPhysicalDeviceCount = instance->physical_device_count;
- } else {
- *pPhysicalDeviceCount =
- MIN2(*pPhysicalDeviceCount, instance->physical_device_count);
- for (unsigned i = 0; i < *pPhysicalDeviceCount; ++i)
- pPhysicalDevices[i] =
- tu_physical_device_to_handle(instance->physical_devices + i);
+ for (uint32_t i = 0; i < instance->physical_device_count; ++i) {
+ vk_outarray_append(&out, p) {
+ *p = tu_physical_device_to_handle(instance->physical_devices + i);
+ }
+
}
- return *pPhysicalDeviceCount < instance->physical_device_count
- ? VK_INCOMPLETE
- : VK_SUCCESS;
+ return vk_outarray_status(&out);
}
VkResult
VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties)
{
TU_FROM_HANDLE(tu_instance, instance, _instance);
+ VK_OUTARRAY_MAKE(out, pPhysicalDeviceGroupProperties, pPhysicalDeviceGroupCount);
VkResult result;
if (instance->physical_device_count < 0) {
return result;
}
- if (!pPhysicalDeviceGroupProperties) {
- *pPhysicalDeviceGroupCount = instance->physical_device_count;
- } else {
- *pPhysicalDeviceGroupCount =
- MIN2(*pPhysicalDeviceGroupCount, instance->physical_device_count);
- for (unsigned i = 0; i < *pPhysicalDeviceGroupCount; ++i) {
- pPhysicalDeviceGroupProperties[i].physicalDeviceCount = 1;
- pPhysicalDeviceGroupProperties[i].physicalDevices[0] =
+ for (uint32_t i = 0; i < instance->physical_device_count; ++i) {
+ vk_outarray_append(&out, p) {
+ p->physicalDeviceCount = 1;
+ p->physicalDevices[0] =
tu_physical_device_to_handle(instance->physical_devices + i);
- pPhysicalDeviceGroupProperties[i].subsetAllocation = false;
+ p->subsetAllocation = false;
}
}
- return *pPhysicalDeviceGroupCount < instance->physical_device_count
- ? VK_INCOMPLETE
- : VK_SUCCESS;
+
+ return vk_outarray_status(&out);
}
void
}
}
-static void
-tu_get_physical_device_queue_family_properties(
- struct tu_physical_device *pdevice,
- uint32_t *pCount,
- VkQueueFamilyProperties **pQueueFamilyProperties)
-{
- int num_queue_families = 1;
- int idx;
- if (pQueueFamilyProperties == NULL) {
- *pCount = num_queue_families;
- return;
- }
-
- if (!*pCount)
- return;
-
- idx = 0;
- if (*pCount >= 1) {
- *pQueueFamilyProperties[idx] = (VkQueueFamilyProperties){
- .queueFlags =
- VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT,
- .queueCount = 1,
- .timestampValidBits = 64,
- .minImageTransferGranularity = (VkExtent3D){ 1, 1, 1 },
- };
- idx++;
- }
-
- *pCount = idx;
-}
+static const VkQueueFamilyProperties
+tu_queue_family_properties = {
+ .queueFlags = VK_QUEUE_GRAPHICS_BIT |
+ VK_QUEUE_COMPUTE_BIT |
+ VK_QUEUE_TRANSFER_BIT,
+ .queueCount = 1,
+ .timestampValidBits = 64,
+ .minImageTransferGranularity = (VkExtent3D) { 1, 1, 1 },
+};
void
tu_GetPhysicalDeviceQueueFamilyProperties(
VkPhysicalDevice physicalDevice,
- uint32_t *pCount,
+ uint32_t *pQueueFamilyPropertyCount,
VkQueueFamilyProperties *pQueueFamilyProperties)
{
- TU_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
- if (!pQueueFamilyProperties) {
- return tu_get_physical_device_queue_family_properties(
- pdevice, pCount, NULL);
- return;
+ VK_OUTARRAY_MAKE(out, pQueueFamilyProperties, pQueueFamilyPropertyCount);
+
+ vk_outarray_append(&out, p) {
+ *p = tu_queue_family_properties;
}
- VkQueueFamilyProperties *properties[] = {
- pQueueFamilyProperties + 0,
- };
- tu_get_physical_device_queue_family_properties(pdevice, pCount, properties);
- assert(*pCount <= 1);
}
void
tu_GetPhysicalDeviceQueueFamilyProperties2(
VkPhysicalDevice physicalDevice,
- uint32_t *pCount,
+ uint32_t *pQueueFamilyPropertyCount,
VkQueueFamilyProperties2KHR *pQueueFamilyProperties)
{
- TU_FROM_HANDLE(tu_physical_device, pdevice, physicalDevice);
- if (!pQueueFamilyProperties) {
- return tu_get_physical_device_queue_family_properties(
- pdevice, pCount, NULL);
- return;
+ VK_OUTARRAY_MAKE(out, pQueueFamilyProperties, pQueueFamilyPropertyCount);
+
+ vk_outarray_append(&out, p) {
+ p->queueFamilyProperties = tu_queue_family_properties;
}
- VkQueueFamilyProperties *properties[] = {
- &pQueueFamilyProperties[0].queueFamilyProperties,
- };
- tu_get_physical_device_queue_family_properties(pdevice, pCount, properties);
- assert(*pCount <= 1);
}
static uint64_t
{
VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
+ /* We spport no lyaers */
+ if (pLayerName)
+ return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
+
for (int i = 0; i < TU_INSTANCE_EXTENSION_COUNT; i++) {
if (tu_supported_instance_extensions.extensions[i]) {
vk_outarray_append(&out, prop) { *prop = tu_instance_extensions[i]; }
uint32_t *pPropertyCount,
VkExtensionProperties *pProperties)
{
+ /* We spport no lyaers */
TU_FROM_HANDLE(tu_physical_device, device, physicalDevice);
VK_OUTARRAY_MAKE(out, pProperties, pPropertyCount);
+ /* We spport no lyaers */
+ if (pLayerName)
+ return vk_error(NULL, VK_ERROR_LAYER_NOT_PRESENT);
+
for (int i = 0; i < TU_DEVICE_EXTENSION_COUNT; i++) {
if (device->supported_extensions.extensions[i]) {
vk_outarray_append(&out, prop) { *prop = tu_device_extensions[i]; }