The API version exposed by a particular device can be completely different from what is exported by the parent instance. Since Vulkan 1.1 it is also possible to use newer device API than supported by the instance API version (with the appropriate version checks). Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8554>
1320 lines
58 KiB
C
1320 lines
58 KiB
C
/*
|
|
* GStreamer
|
|
* Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "gstvkphysicaldevice.h"
|
|
|
|
#include "gstvkphysicaldevice-private.h"
|
|
#include "gstvkdebug.h"
|
|
|
|
#include <string.h>
|
|
|
|
/**
|
|
* SECTION:vkphysicaldevice
|
|
* @title: GstVulkanPhysicalDevice
|
|
* @short_description: Vulkan physical device
|
|
* @see_also: #GstVulkanInstance, #GstVulkanDevice
|
|
*
|
|
* A #GstVulkanPhysicalDevice encapsulates a VkPhysicalDevice
|
|
*/
|
|
|
|
#define GST_CAT_DEFAULT gst_vulkan_physical_device_debug
|
|
GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
|
|
|
|
enum
|
|
{
|
|
PROP_0,
|
|
PROP_INSTANCE,
|
|
PROP_DEVICE_ID,
|
|
PROP_NAME,
|
|
};
|
|
|
|
static void gst_vulkan_physical_device_finalize (GObject * object);
|
|
|
|
struct _GstVulkanPhysicalDevicePrivate
|
|
{
|
|
guint32 n_available_layers;
|
|
VkLayerProperties *available_layers;
|
|
|
|
guint32 n_available_extensions;
|
|
VkExtensionProperties *available_extensions;
|
|
|
|
#if defined (VK_API_VERSION_1_2)
|
|
VkPhysicalDeviceFeatures2 features10;
|
|
VkPhysicalDeviceProperties2 properties10;
|
|
VkPhysicalDeviceVulkan11Features features11;
|
|
VkPhysicalDeviceVulkan11Properties properties11;
|
|
VkPhysicalDeviceVulkan12Features features12;
|
|
VkPhysicalDeviceVulkan12Properties properties12;
|
|
#endif
|
|
#if defined (VK_API_VERSION_1_3)
|
|
VkPhysicalDeviceVulkan13Features features13;
|
|
VkPhysicalDeviceVulkan13Properties properties13;
|
|
#if defined (VK_KHR_video_maintenance1)
|
|
VkPhysicalDeviceVideoMaintenance1FeaturesKHR videomaintenance1;
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
static void
|
|
_init_debug (void)
|
|
{
|
|
static gsize init;
|
|
|
|
if (g_once_init_enter (&init)) {
|
|
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "vulkandevice", 0,
|
|
"Vulkan Device");
|
|
g_once_init_leave (&init, 1);
|
|
}
|
|
}
|
|
|
|
#define GET_PRIV(device) gst_vulkan_physical_device_get_instance_private (device)
|
|
|
|
#define gst_vulkan_physical_device_parent_class parent_class
|
|
G_DEFINE_TYPE_WITH_CODE (GstVulkanPhysicalDevice, gst_vulkan_physical_device,
|
|
GST_TYPE_OBJECT, G_ADD_PRIVATE (GstVulkanPhysicalDevice);
|
|
_init_debug ());
|
|
|
|
static gboolean gst_vulkan_physical_device_fill_info (GstVulkanPhysicalDevice *
|
|
device, GError ** error);
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_new:
|
|
* @instance: the parent #GstVulkanInstance
|
|
*
|
|
* Returns: (transfer full): a new #GstVulkanPhysicalDevice
|
|
*
|
|
* Since: 1.18
|
|
*/
|
|
GstVulkanPhysicalDevice *
|
|
gst_vulkan_physical_device_new (GstVulkanInstance * instance,
|
|
guint device_index)
|
|
{
|
|
GstVulkanPhysicalDevice *device;
|
|
|
|
g_return_val_if_fail (GST_IS_VULKAN_INSTANCE (instance), NULL);
|
|
|
|
device = g_object_new (GST_TYPE_VULKAN_PHYSICAL_DEVICE, "instance", instance,
|
|
"device-index", device_index, NULL);
|
|
gst_object_ref_sink (device);
|
|
|
|
return device;
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_set_property (GObject * object, guint prop_id,
|
|
const GValue * value, GParamSpec * pspec)
|
|
{
|
|
GstVulkanPhysicalDevice *device = GST_VULKAN_PHYSICAL_DEVICE (object);
|
|
|
|
switch (prop_id) {
|
|
case PROP_INSTANCE:
|
|
device->instance = g_value_dup_object (value);
|
|
break;
|
|
case PROP_DEVICE_ID:{
|
|
guint device_id = g_value_get_uint (value);
|
|
if (device->instance == VK_NULL_HANDLE
|
|
|| device_id >= device->instance->n_physical_devices) {
|
|
g_critical ("%s: Cannot set device-index larger than the "
|
|
"number of physical devices", GST_OBJECT_NAME (device));
|
|
} else {
|
|
device->device_index = device_id;
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_get_property (GObject * object, guint prop_id,
|
|
GValue * value, GParamSpec * pspec)
|
|
{
|
|
GstVulkanPhysicalDevice *device = GST_VULKAN_PHYSICAL_DEVICE (object);
|
|
|
|
switch (prop_id) {
|
|
case PROP_INSTANCE:
|
|
g_value_set_object (value, device->instance);
|
|
break;
|
|
case PROP_DEVICE_ID:
|
|
g_value_set_uint (value, device->device_index);
|
|
break;
|
|
case PROP_NAME:
|
|
g_value_set_string (value, device->properties.deviceName);
|
|
break;
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_init (GstVulkanPhysicalDevice * device)
|
|
{
|
|
GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
|
|
|
|
priv->n_available_layers = 0;
|
|
priv->n_available_extensions = 0;
|
|
|
|
#if defined (VK_API_VERSION_1_2)
|
|
priv->properties10.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
|
|
priv->properties11.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES;
|
|
priv->properties12.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES;
|
|
priv->properties10.pNext = &priv->properties11;
|
|
priv->properties11.pNext = &priv->properties12;
|
|
|
|
priv->features10.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
|
|
priv->features11.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
|
|
priv->features12.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
|
|
priv->features10.pNext = &priv->features11;
|
|
priv->features11.pNext = &priv->features12;
|
|
#endif
|
|
#if defined (VK_API_VERSION_1_3)
|
|
priv->properties13.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES;
|
|
priv->properties12.pNext = &priv->properties13;
|
|
|
|
priv->features13.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
|
|
priv->features12.pNext = &priv->features13;
|
|
#if defined (VK_KHR_video_maintenance1)
|
|
priv->videomaintenance1.sType =
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR;
|
|
priv->features13.pNext = &priv->videomaintenance1;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_constructed (GObject * object)
|
|
{
|
|
GstVulkanPhysicalDevice *device = GST_VULKAN_PHYSICAL_DEVICE (object);
|
|
GError *error = NULL;
|
|
|
|
G_OBJECT_CLASS (parent_class)->constructed (object);
|
|
|
|
if (device->instance == VK_NULL_HANDLE) {
|
|
GST_ERROR_OBJECT (object, "Constructed without any instance set");
|
|
return;
|
|
}
|
|
|
|
device->device = device->instance->physical_devices[device->device_index];
|
|
|
|
if (!gst_vulkan_physical_device_fill_info (device, &error)) {
|
|
GST_ERROR_OBJECT (object, "%s", error->message);
|
|
g_clear_error (&error);
|
|
}
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_class_init (GstVulkanPhysicalDeviceClass *
|
|
device_class)
|
|
{
|
|
GObjectClass *gobject_class = (GObjectClass *) device_class;
|
|
|
|
gobject_class->set_property = gst_vulkan_physical_device_set_property;
|
|
gobject_class->get_property = gst_vulkan_physical_device_get_property;
|
|
gobject_class->finalize = gst_vulkan_physical_device_finalize;
|
|
gobject_class->constructed = gst_vulkan_physical_device_constructed;
|
|
|
|
g_object_class_install_property (gobject_class, PROP_INSTANCE,
|
|
g_param_spec_object ("instance", "Instance",
|
|
"Associated Vulkan Instance",
|
|
GST_TYPE_VULKAN_INSTANCE,
|
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
|
|
|
|
g_object_class_install_property (gobject_class, PROP_DEVICE_ID,
|
|
g_param_spec_uint ("device-index", "Device Index", "Device Index", 0,
|
|
G_MAXUINT32, 0,
|
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
|
|
|
|
g_object_class_install_property (gobject_class, PROP_NAME,
|
|
g_param_spec_string ("name", "Name", "Device Name", NULL,
|
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
}
|
|
|
|
static void
|
|
gst_vulkan_physical_device_finalize (GObject * object)
|
|
{
|
|
GstVulkanPhysicalDevice *device = GST_VULKAN_PHYSICAL_DEVICE (object);
|
|
GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
|
|
|
|
g_free (priv->available_layers);
|
|
priv->available_layers = NULL;
|
|
|
|
g_free (priv->available_extensions);
|
|
priv->available_extensions = NULL;
|
|
|
|
g_free (device->queue_family_ops);
|
|
g_free (device->queue_family_props);
|
|
device->queue_family_props = NULL;
|
|
|
|
if (device->instance)
|
|
gst_object_unref (device->instance);
|
|
device->instance = VK_NULL_HANDLE;
|
|
|
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
}
|
|
|
|
#define DEBUG_BOOL(prefix, name, value) \
|
|
GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) ": %s", \
|
|
value ? "YES" : "NO")
|
|
#define DEBUG_1(prefix, s, name, format, type) \
|
|
GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) ": %" format, \
|
|
(type) (s)->name)
|
|
#define DEBUG_2(prefix, s, name, format, type) \
|
|
GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(name) \
|
|
": %" format ", %" format, \
|
|
(type) (s)->name[0], \
|
|
(type) (s)->name[1])
|
|
#define DEBUG_3(prefix, s, name, format, type) \
|
|
GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(limit) \
|
|
": %" format ", %" format ", %" format, \
|
|
(type) (s)->name[0], \
|
|
(type) (s)->name[1], \
|
|
(type) (s)->name[2])
|
|
|
|
#define DEBUG_UINT32(prefix, s, var) DEBUG_1(prefix, s, var, G_GUINT32_FORMAT, guint32)
|
|
#define DEBUG_UINT32_2(prefix, s, var) DEBUG_2(prefix, s, var, G_GUINT32_FORMAT, guint32)
|
|
#define DEBUG_UINT32_3(prefix, s, var) DEBUG_3(prefix, s, var, G_GUINT32_FORMAT, guint32)
|
|
|
|
#define DEBUG_UINT64(prefix, s, var) DEBUG_1(prefix, s, var, G_GUINT64_FORMAT, guint64)
|
|
|
|
#define DEBUG_INT32(prefix, s, var) DEBUG_1(prefix, s, var, G_GINT32_FORMAT, gint32)
|
|
|
|
#define DEBUG_FLOAT(prefix, s, var) DEBUG_1(prefix, s, var, "f", gfloat)
|
|
#define DEBUG_FLOAT_2(prefix, s, var) DEBUG_2(prefix, s, var, "f", gfloat)
|
|
|
|
#define DEBUG_SIZE(prefix, s, var) DEBUG_1(prefix, s, var, G_GSIZE_FORMAT, gsize)
|
|
#define DEBUG_FLAGS(prefix, s, limit, under_name_type) \
|
|
G_STMT_START { \
|
|
gchar *str = G_PASTE(G_PASTE(gst_vulkan_,under_name_type),_flags_to_string) ((s)->limit); \
|
|
GST_DEBUG_OBJECT (device, prefix " " G_STRINGIFY(limit) ": (0x%x) %s", \
|
|
(s)->limit, str); \
|
|
g_free (str); \
|
|
} G_STMT_END
|
|
|
|
#define DEBUG_BOOL_STRUCT(prefix, s, name) DEBUG_BOOL(prefix, name, (s)->name)
|
|
|
|
#define DEBUG_STRING(prefix, s, str) DEBUG_1(prefix, s, str, "s", gchar *);
|
|
|
|
static void
|
|
dump_features10 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceFeatures * features)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
DEBUG_BOOL_STRUCT ("support for", features, robustBufferAccess);
|
|
DEBUG_BOOL_STRUCT ("support for", features, fullDrawIndexUint32);
|
|
DEBUG_BOOL_STRUCT ("support for", features, imageCubeArray);
|
|
DEBUG_BOOL_STRUCT ("support for", features, independentBlend);
|
|
DEBUG_BOOL_STRUCT ("support for", features, geometryShader);
|
|
DEBUG_BOOL_STRUCT ("support for", features, tessellationShader);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sampleRateShading);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sampleRateShading);
|
|
DEBUG_BOOL_STRUCT ("support for", features, dualSrcBlend);
|
|
DEBUG_BOOL_STRUCT ("support for", features, logicOp);
|
|
DEBUG_BOOL_STRUCT ("support for", features, multiDrawIndirect);
|
|
DEBUG_BOOL_STRUCT ("support for", features, drawIndirectFirstInstance);
|
|
DEBUG_BOOL_STRUCT ("support for", features, depthClamp);
|
|
DEBUG_BOOL_STRUCT ("support for", features, depthBiasClamp);
|
|
DEBUG_BOOL_STRUCT ("support for", features, fillModeNonSolid);
|
|
DEBUG_BOOL_STRUCT ("support for", features, depthBounds);
|
|
DEBUG_BOOL_STRUCT ("support for", features, wideLines);
|
|
DEBUG_BOOL_STRUCT ("support for", features, largePoints);
|
|
DEBUG_BOOL_STRUCT ("support for", features, alphaToOne);
|
|
DEBUG_BOOL_STRUCT ("support for", features, multiViewport);
|
|
DEBUG_BOOL_STRUCT ("support for", features, samplerAnisotropy);
|
|
DEBUG_BOOL_STRUCT ("support for", features, textureCompressionETC2);
|
|
DEBUG_BOOL_STRUCT ("support for", features, textureCompressionASTC_LDR);
|
|
DEBUG_BOOL_STRUCT ("support for", features, textureCompressionBC);
|
|
DEBUG_BOOL_STRUCT ("support for", features, occlusionQueryPrecise);
|
|
DEBUG_BOOL_STRUCT ("support for", features, pipelineStatisticsQuery);
|
|
DEBUG_BOOL_STRUCT ("support for", features, vertexPipelineStoresAndAtomics);
|
|
DEBUG_BOOL_STRUCT ("support for", features, fragmentStoresAndAtomics);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderTessellationAndGeometryPointSize);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderImageGatherExtended);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageExtendedFormats);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageMultisample);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageReadWithoutFormat);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageWriteWithoutFormat);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderUniformBufferArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderSampledImageArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageBufferArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderStorageImageArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderClipDistance);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderCullDistance);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderFloat64);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderInt64);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderInt16);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderResourceResidency);
|
|
DEBUG_BOOL_STRUCT ("support for", features, shaderResourceMinLod);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseBinding);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyBuffer);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyImage2D);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyImage3D);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidency2Samples);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidency4Samples);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidency8Samples);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidency16Samples);
|
|
DEBUG_BOOL_STRUCT ("support for", features, sparseResidencyAliased);
|
|
DEBUG_BOOL_STRUCT ("support for", features, variableMultisampleRate);
|
|
DEBUG_BOOL_STRUCT ("support for", features, inheritedQueries);
|
|
/* *INDENT-ON* */
|
|
}
|
|
|
|
#if defined (VK_API_VERSION_1_2)
|
|
static void
|
|
dump_features11 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan11Features * features)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, storageBuffer16BitAccess);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, uniformAndStorageBuffer16BitAccess);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, storagePushConstant16);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, storageInputOutput16);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiview);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiviewGeometryShader);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, multiviewTessellationShader);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, variablePointersStorageBuffer);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, variablePointers);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, protectedMemory);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, samplerYcbcrConversion);
|
|
DEBUG_BOOL_STRUCT ("support for (1.1)", features, shaderDrawParameters);
|
|
/* *INDENT-ON* */
|
|
}
|
|
|
|
static void
|
|
dump_features12 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan12Features * features)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, samplerMirrorClampToEdge);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, drawIndirectCount);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, storageBuffer8BitAccess);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, uniformAndStorageBuffer8BitAccess);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderBufferInt64Atomics);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSharedInt64Atomics);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderFloat16);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInt8);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInputAttachmentArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformTexelBufferArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageTexelBufferArrayDynamicIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformBufferArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSampledImageArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageBufferArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderStorageImageArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderInputAttachmentArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderUniformTexelBufferArrayNonUniformIndexing);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUniformBufferUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingSampledImageUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageImageUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageBufferUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUniformTexelBufferUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingStorageTexelBufferUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingUpdateUnusedWhilePending);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingPartiallyBound);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, descriptorBindingVariableDescriptorCount);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, runtimeDescriptorArray);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, samplerFilterMinmax);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, scalarBlockLayout);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, imagelessFramebuffer);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, uniformBufferStandardLayout);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderSubgroupExtendedTypes);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, separateDepthStencilLayouts);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, hostQueryReset);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, timelineSemaphore);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddress);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddressCaptureReplay);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, bufferDeviceAddressMultiDevice);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModel);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModelDeviceScope);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, vulkanMemoryModelAvailabilityVisibilityChains);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderOutputViewportIndex);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, shaderOutputLayer);
|
|
DEBUG_BOOL_STRUCT ("support for (1.2)", features, subgroupBroadcastDynamicId);
|
|
/* *INDENT-ON* */
|
|
}
|
|
#endif
|
|
|
|
#if defined (VK_API_VERSION_1_3)
|
|
static void
|
|
dump_features13 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan13Features * features)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, robustImageAccess);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, inlineUniformBlock);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, descriptorBindingInlineUniformBlockUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, pipelineCreationCacheControl);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, privateData);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, shaderDemoteToHelperInvocation);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, shaderTerminateInvocation);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, subgroupSizeControl);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, computeFullSubgroups);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, synchronization2);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, textureCompressionASTC_HDR);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, shaderZeroInitializeWorkgroupMemory);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, dynamicRendering);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, shaderIntegerDotProduct);
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, maintenance4);
|
|
/* *INDENT-ON* */
|
|
}
|
|
|
|
#if defined(VK_KHR_video_maintenance1)
|
|
static void
|
|
dump_videomaintenance1 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVideoMaintenance1FeaturesKHR * features)
|
|
{
|
|
DEBUG_BOOL_STRUCT ("support for (1.3)", features, videoMaintenance1);
|
|
}
|
|
#endif
|
|
#endif /* defined (VK_API_VERSION_1_3) */
|
|
|
|
static gboolean
|
|
dump_features (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
#if defined (VK_API_VERSION_1_2)
|
|
GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
|
|
VkBaseOutStructure *iter;
|
|
|
|
if (gst_vulkan_physical_device_check_api_version (device, 1, 2, 0)) {
|
|
for (iter = (VkBaseOutStructure *) & priv->features10; iter;
|
|
iter = iter->pNext) {
|
|
if (iter->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2)
|
|
dump_features10 (device,
|
|
&((VkPhysicalDeviceFeatures2 *) iter)->features);
|
|
else if (iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES)
|
|
dump_features11 (device, (VkPhysicalDeviceVulkan11Features *) iter);
|
|
else if (iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES)
|
|
dump_features12 (device, (VkPhysicalDeviceVulkan12Features *) iter);
|
|
#if defined (VK_API_VERSION_1_3)
|
|
else if (gst_vulkan_physical_device_check_api_version (device, 1, 3, 0)
|
|
&& iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES)
|
|
dump_features13 (device, (VkPhysicalDeviceVulkan13Features *) iter);
|
|
#if defined(VK_KHR_video_maintenance1)
|
|
else if (gst_vulkan_physical_device_check_api_version (device, 1, 3, 283)
|
|
&& iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR)
|
|
dump_videomaintenance1 (device,
|
|
(VkPhysicalDeviceVideoMaintenance1FeaturesKHR *) iter);
|
|
#endif
|
|
#endif
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
dump_features10 (device, &device->features);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
dump_memory_properties (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
int i;
|
|
|
|
GST_DEBUG_OBJECT (device, "found %" G_GUINT32_FORMAT " memory heaps",
|
|
device->memory_properties.memoryHeapCount);
|
|
for (i = 0; i < device->memory_properties.memoryHeapCount; i++) {
|
|
gchar *prop_flags_str =
|
|
gst_vulkan_memory_heap_flags_to_string (device->
|
|
memory_properties.memoryHeaps[i].flags);
|
|
GST_LOG_OBJECT (device,
|
|
"memory heap at index %i has size %" G_GUINT64_FORMAT
|
|
" and flags (0x%x) \'%s\'", i,
|
|
(guint64) device->memory_properties.memoryHeaps[i].size,
|
|
device->memory_properties.memoryHeaps[i].flags, prop_flags_str);
|
|
g_free (prop_flags_str);
|
|
}
|
|
GST_DEBUG_OBJECT (device, "found %" G_GUINT32_FORMAT " memory types",
|
|
device->memory_properties.memoryTypeCount);
|
|
for (i = 0; i < device->memory_properties.memoryTypeCount; i++) {
|
|
gchar *prop_flags_str =
|
|
gst_vulkan_memory_property_flags_to_string (device->memory_properties.
|
|
memoryTypes[i].propertyFlags);
|
|
GST_LOG_OBJECT (device,
|
|
"memory type at index %i is allocatable from "
|
|
"heap %i with flags (0x%x) \'%s\'", i,
|
|
device->memory_properties.memoryTypes[i].heapIndex,
|
|
device->memory_properties.memoryTypes[i].propertyFlags, prop_flags_str);
|
|
g_free (prop_flags_str);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
dump_queue_properties (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
int i;
|
|
|
|
GST_DEBUG_OBJECT (device, "found %" G_GUINT32_FORMAT " queue families",
|
|
device->n_queue_families);
|
|
for (i = 0; i < device->n_queue_families; i++) {
|
|
gchar *queue_flags_str =
|
|
gst_vulkan_queue_flags_to_string (device->
|
|
queue_family_props[i].queueFlags);
|
|
GST_LOG_OBJECT (device,
|
|
"queue family at index %i supports %i queues "
|
|
"with flags (0x%x) \'%s\', video operations (0x%x), %" G_GUINT32_FORMAT
|
|
" timestamp bits and a minimum image transfer granuality of %"
|
|
GST_VULKAN_EXTENT3D_FORMAT, i, device->queue_family_props[i].queueCount,
|
|
device->queue_family_props[i].queueFlags, queue_flags_str,
|
|
device->queue_family_ops ? device->queue_family_ops[i].video : 0,
|
|
device->queue_family_props[i].timestampValidBits,
|
|
GST_VULKAN_EXTENT3D_ARGS (device->
|
|
queue_family_props[i].minImageTransferGranularity));
|
|
g_free (queue_flags_str);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
dump_limits (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
VkPhysicalDeviceLimits *limits = &device->properties.limits;
|
|
|
|
/* *INDENT-OFF* */
|
|
DEBUG_UINT32 ("limit", limits, maxImageDimension1D);
|
|
DEBUG_UINT32 ("limit", limits, maxImageDimension2D);
|
|
DEBUG_UINT32 ("limit", limits, maxImageDimension3D);
|
|
DEBUG_UINT32 ("limit", limits, maxImageDimensionCube);
|
|
DEBUG_UINT32 ("limit", limits, maxImageArrayLayers);
|
|
DEBUG_UINT32 ("limit", limits, maxTexelBufferElements);
|
|
DEBUG_UINT32 ("limit", limits, maxUniformBufferRange);
|
|
DEBUG_UINT32 ("limit", limits, maxStorageBufferRange);
|
|
DEBUG_UINT32 ("limit", limits, maxPushConstantsSize);
|
|
DEBUG_UINT32 ("limit", limits, maxMemoryAllocationCount);
|
|
DEBUG_UINT32 ("limit", limits, maxSamplerAllocationCount);
|
|
DEBUG_UINT64 ("limit", limits, bufferImageGranularity);
|
|
DEBUG_UINT64 ("limit", limits, sparseAddressSpaceSize);
|
|
DEBUG_UINT32 ("limit", limits, maxBoundDescriptorSets);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorSamplers);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorUniformBuffers);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorStorageBuffers);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorSampledImages);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorStorageImages);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageDescriptorInputAttachments);
|
|
DEBUG_UINT32 ("limit", limits, maxPerStageResources);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetSamplers);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetUniformBuffers);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetUniformBuffersDynamic);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageBuffers);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageBuffersDynamic);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetSampledImages);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetStorageImages);
|
|
DEBUG_UINT32 ("limit", limits, maxDescriptorSetInputAttachments);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexInputAttributes);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexInputBindings);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexInputBindings);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexInputAttributeOffset);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexInputBindingStride);
|
|
DEBUG_UINT32 ("limit", limits, maxVertexOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationGenerationLevel);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationPatchSize);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationControlPerVertexInputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationControlPerVertexOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationControlPerPatchOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationControlTotalOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationControlTotalOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationEvaluationInputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxTessellationEvaluationOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxGeometryShaderInvocations);
|
|
DEBUG_UINT32 ("limit", limits, maxGeometryInputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxGeometryOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxGeometryOutputVertices);
|
|
DEBUG_UINT32 ("limit", limits, maxGeometryTotalOutputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxFragmentInputComponents);
|
|
DEBUG_UINT32 ("limit", limits, maxFragmentOutputAttachments);
|
|
DEBUG_UINT32 ("limit", limits, maxFragmentDualSrcAttachments);
|
|
DEBUG_UINT32 ("limit", limits, maxFragmentCombinedOutputResources);
|
|
DEBUG_UINT32 ("limit", limits, maxComputeSharedMemorySize);
|
|
DEBUG_UINT32_3 ("limit", limits, maxComputeWorkGroupCount);
|
|
DEBUG_UINT32 ("limit", limits, maxComputeWorkGroupInvocations);
|
|
DEBUG_UINT32_3 ("limit", limits, maxComputeWorkGroupSize);
|
|
DEBUG_UINT32 ("limit", limits, subPixelPrecisionBits);
|
|
DEBUG_UINT32 ("limit", limits, subTexelPrecisionBits);
|
|
DEBUG_UINT32 ("limit", limits, mipmapPrecisionBits);
|
|
DEBUG_UINT32 ("limit", limits, maxDrawIndexedIndexValue);
|
|
DEBUG_UINT32 ("limit", limits, maxDrawIndirectCount);
|
|
DEBUG_FLOAT ("limit", limits, maxSamplerLodBias);
|
|
DEBUG_FLOAT ("limit", limits, maxSamplerAnisotropy);
|
|
DEBUG_UINT32 ("limit", limits, maxViewports);
|
|
DEBUG_UINT32_2 ("limit", limits, maxViewportDimensions);
|
|
DEBUG_FLOAT_2 ("limit", limits, viewportBoundsRange);
|
|
DEBUG_UINT32 ("limit", limits, viewportSubPixelBits);
|
|
DEBUG_SIZE ("limit", limits, minMemoryMapAlignment);
|
|
DEBUG_UINT64 ("limit", limits, minTexelBufferOffsetAlignment);
|
|
DEBUG_UINT64 ("limit", limits, minUniformBufferOffsetAlignment);
|
|
DEBUG_UINT64 ("limit", limits, minStorageBufferOffsetAlignment);
|
|
DEBUG_INT32 ("limit", limits, minTexelOffset);
|
|
DEBUG_UINT32 ("limit", limits, maxTexelOffset);
|
|
DEBUG_INT32 ("limit", limits, minTexelGatherOffset);
|
|
DEBUG_UINT32 ("limit", limits, maxTexelGatherOffset);
|
|
DEBUG_FLOAT ("limit", limits, minInterpolationOffset);
|
|
DEBUG_FLOAT ("limit", limits, maxInterpolationOffset);
|
|
DEBUG_UINT32 ("limit", limits, subPixelInterpolationOffsetBits);
|
|
DEBUG_UINT32 ("limit", limits, maxFramebufferWidth);
|
|
DEBUG_UINT32 ("limit", limits, maxFramebufferHeight);
|
|
DEBUG_UINT32 ("limit", limits, maxFramebufferLayers);
|
|
DEBUG_FLAGS ("limit", limits, framebufferColorSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, framebufferDepthSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, framebufferStencilSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, framebufferNoAttachmentsSampleCounts, sample_count);
|
|
DEBUG_UINT32 ("limit", limits, maxColorAttachments);
|
|
DEBUG_FLAGS ("limit", limits, sampledImageColorSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, sampledImageIntegerSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, sampledImageDepthSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, sampledImageStencilSampleCounts, sample_count);
|
|
DEBUG_FLAGS ("limit", limits, storageImageSampleCounts, sample_count);
|
|
DEBUG_BOOL_STRUCT ("limit", limits, timestampComputeAndGraphics);
|
|
DEBUG_FLOAT ("limit", limits, timestampPeriod);
|
|
DEBUG_UINT32 ("limit", limits, maxClipDistances);
|
|
DEBUG_UINT32 ("limit", limits, maxCullDistances);
|
|
DEBUG_UINT32 ("limit", limits, maxCombinedClipAndCullDistances);
|
|
DEBUG_UINT32 ("limit", limits, discreteQueuePriorities);
|
|
DEBUG_FLOAT_2 ("limit", limits, pointSizeRange);
|
|
DEBUG_FLOAT_2 ("limit", limits, lineWidthRange);
|
|
DEBUG_FLOAT ("limit", limits, pointSizeGranularity);
|
|
DEBUG_FLOAT ("limit", limits, lineWidthGranularity);
|
|
DEBUG_BOOL_STRUCT ("limit", limits, strictLines);
|
|
DEBUG_BOOL_STRUCT ("limit", limits, standardSampleLocations);
|
|
DEBUG_UINT64 ("limit", limits, optimalBufferCopyOffsetAlignment);
|
|
DEBUG_UINT64 ("limit", limits, optimalBufferCopyRowPitchAlignment);
|
|
DEBUG_UINT64 ("limit", limits, nonCoherentAtomSize);
|
|
/* *INDENT-ON* */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
dump_sparse_properties (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
VkPhysicalDeviceSparseProperties *props =
|
|
&device->properties.sparseProperties;
|
|
|
|
/* *INDENT-OFF* */
|
|
DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard2DBlockShape);
|
|
DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard2DMultisampleBlockShape);
|
|
DEBUG_BOOL_STRUCT ("sparse property", props, residencyStandard3DBlockShape);
|
|
DEBUG_BOOL_STRUCT ("sparse property", props, residencyAlignedMipSize);
|
|
DEBUG_BOOL_STRUCT ("sparse property", props, residencyNonResidentStrict);
|
|
/* *INDENT-ON* */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
#if defined (VK_API_VERSION_1_2)
|
|
static void
|
|
dump_properties11 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan11Properties * properties)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
/* uint8_t deviceUUID[VK_UUID_SIZE];
|
|
uint8_t driverUUID[VK_UUID_SIZE];
|
|
uint8_t deviceLUID[VK_LUID_SIZE];*/
|
|
DEBUG_UINT32 ("properties (1.1)", properties, deviceNodeMask);
|
|
/* VkBool32 deviceLUIDValid;*/
|
|
DEBUG_UINT32 ("properties (1.1)", properties, subgroupSize);
|
|
/* VkShaderStageFlags subgroupSupportedStages;
|
|
VkSubgroupFeatureFlags subgroupSupportedOperations;*/
|
|
DEBUG_BOOL_STRUCT ("properties (1.1)", properties, subgroupQuadOperationsInAllStages);
|
|
/* VkPointClippingBehavior pointClippingBehavior;*/
|
|
DEBUG_UINT32 ("properties (1.1)", properties, maxMultiviewViewCount);
|
|
DEBUG_UINT32 ("properties (1.1)", properties, maxMultiviewInstanceIndex);
|
|
DEBUG_BOOL_STRUCT ("properties (1.1)", properties, protectedNoFault);
|
|
DEBUG_UINT32 ("properties (1.1)", properties, maxPerSetDescriptors);
|
|
DEBUG_SIZE ("properties (1.1)", properties, maxMemoryAllocationSize);
|
|
/* *INDENT-ON* */
|
|
}
|
|
|
|
static void
|
|
dump_properties12 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan12Properties * properties)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
/* VkDriverId driverID;*/
|
|
DEBUG_STRING ("properties (1.2)", properties, driverName);
|
|
DEBUG_STRING ("properties (1.2)", properties, driverInfo);
|
|
/* VkConformanceVersion conformanceVersion;
|
|
VkShaderFloatControlsIndependence denormBehaviorIndependence;
|
|
VkShaderFloatControlsIndependence roundingModeIndependence;*/
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat32);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSignedZeroInfNanPreserveFloat64);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat32);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormPreserveFloat64);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderDenormFlushToZeroFloat32);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat32);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTEFloat64);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat16);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat32);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderRoundingModeRTZFloat64);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxUpdateAfterBindDescriptorsInAllPools);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderUniformBufferArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSampledImageArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderSampledImageArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderStorageBufferArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderStorageImageArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, shaderInputAttachmentArrayNonUniformIndexingNative);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, robustBufferAccessUpdateAfterBind);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, quadDivergentImplicitLod);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindSamplers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindUniformBuffers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindStorageBuffers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindSampledImages);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindStorageImages);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageDescriptorUpdateAfterBindInputAttachments);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxPerStageUpdateAfterBindResources);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindSamplers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindUniformBuffers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindUniformBuffersDynamic);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageBuffers);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageBuffersDynamic);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindSampledImages);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindStorageImages);
|
|
DEBUG_UINT32 ("properties (1.2)", properties, maxDescriptorSetUpdateAfterBindInputAttachments);
|
|
/* VkResolveModeFlags supportedDepthResolveModes;
|
|
VkResolveModeFlags supportedStencilResolveModes;*/
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, independentResolveNone);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, independentResolve);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, filterMinmaxSingleComponentFormats);
|
|
DEBUG_BOOL_STRUCT ("properties (1.2)", properties, filterMinmaxImageComponentMapping);
|
|
DEBUG_UINT64 ("properties (1.2)", properties, maxTimelineSemaphoreValueDifference);
|
|
DEBUG_FLAGS ("properties (1.2)", properties, framebufferIntegerColorSampleCounts, sample_count);
|
|
/* *INDENT-ON* */
|
|
}
|
|
#endif
|
|
|
|
#if defined(VK_API_VERSION_1_3)
|
|
static void
|
|
dump_properties13 (GstVulkanPhysicalDevice * device,
|
|
VkPhysicalDeviceVulkan13Properties * properties)
|
|
{
|
|
/* *INDENT-OFF* */
|
|
DEBUG_UINT32 ("properties (1.3)", properties, minSubgroupSize);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxSubgroupSize);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxComputeWorkgroupSubgroups);
|
|
/* VkShaderStageFlags requiredSubgroupSizeStages; */
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxInlineUniformBlockSize);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxPerStageDescriptorInlineUniformBlocks);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxDescriptorSetInlineUniformBlocks);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
|
|
DEBUG_UINT32 ("properties (1.3)", properties, maxInlineUniformTotalSize);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct8BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct8BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct8BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct4x8BitPackedUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct4x8BitPackedSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct4x8BitPackedMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct16BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct16BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct16BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct32BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct32BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct32BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct64BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct64BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProduct64BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating8BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating8BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating16BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating16BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating32BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating32BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating64BitUnsignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating64BitSignedAccelerated);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated);
|
|
DEBUG_SIZE ("properties (1.3)", properties, storageTexelBufferOffsetAlignmentBytes);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, storageTexelBufferOffsetSingleTexelAlignment);
|
|
DEBUG_SIZE ("properties (1.3)", properties, uniformTexelBufferOffsetAlignmentBytes);
|
|
DEBUG_BOOL_STRUCT ("properties (1.3)", properties, uniformTexelBufferOffsetSingleTexelAlignment);
|
|
DEBUG_SIZE ("properties (1.3)", properties, maxBufferSize);
|
|
/* *INDENT-ON* */
|
|
}
|
|
#endif
|
|
|
|
static gboolean
|
|
physical_device_info (GstVulkanPhysicalDevice * device, GError ** error)
|
|
{
|
|
#if defined (VK_API_VERSION_1_2)
|
|
GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
|
|
VkBaseOutStructure *iter;
|
|
#endif
|
|
|
|
GST_INFO_OBJECT (device, "physical device %i name \'%s\' type \'%s\' "
|
|
"api version %u.%u.%u, driver version %u.%u.%u vendor ID 0x%x, "
|
|
"device ID 0x%x", device->device_index, device->properties.deviceName,
|
|
gst_vulkan_physical_device_type_to_string (device->properties.deviceType),
|
|
VK_VERSION_MAJOR (device->properties.apiVersion),
|
|
VK_VERSION_MINOR (device->properties.apiVersion),
|
|
VK_VERSION_PATCH (device->properties.apiVersion),
|
|
VK_VERSION_MAJOR (device->properties.driverVersion),
|
|
VK_VERSION_MINOR (device->properties.driverVersion),
|
|
VK_VERSION_PATCH (device->properties.driverVersion),
|
|
device->properties.vendorID, device->properties.deviceID);
|
|
|
|
if (!dump_queue_properties (device, error))
|
|
return FALSE;
|
|
if (!dump_memory_properties (device, error))
|
|
return FALSE;
|
|
if (!dump_features (device, error))
|
|
return FALSE;
|
|
if (!dump_limits (device, error))
|
|
return FALSE;
|
|
if (!dump_sparse_properties (device, error))
|
|
return FALSE;
|
|
|
|
#if defined (VK_API_VERSION_1_2)
|
|
if (gst_vulkan_physical_device_check_api_version (device, 1, 2, 0)) {
|
|
for (iter = (VkBaseOutStructure *) & priv->properties10; iter;
|
|
iter = iter->pNext) {
|
|
if (iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES)
|
|
dump_properties11 (device, (VkPhysicalDeviceVulkan11Properties *) iter);
|
|
else if (iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES)
|
|
dump_properties12 (device, (VkPhysicalDeviceVulkan12Properties *) iter);
|
|
#if defined (VK_API_VERSION_1_3)
|
|
else if (gst_vulkan_physical_device_check_api_version (device, 1, 3, 0)
|
|
&& iter->sType ==
|
|
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES)
|
|
dump_properties13 (device, (VkPhysicalDeviceVulkan13Properties *) iter);
|
|
#endif
|
|
}
|
|
}
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static gboolean
|
|
gst_vulkan_physical_device_fill_info (GstVulkanPhysicalDevice * device,
|
|
GError ** error)
|
|
{
|
|
GstVulkanPhysicalDevicePrivate *priv = GET_PRIV (device);
|
|
VkResult err;
|
|
guint i;
|
|
|
|
device->device = gst_vulkan_physical_device_get_handle (device);
|
|
if (!device->device) {
|
|
g_set_error (error, GST_VULKAN_ERROR, VK_ERROR_INITIALIZATION_FAILED,
|
|
"Failed to retrieve physical device");
|
|
goto error;
|
|
}
|
|
|
|
err =
|
|
vkEnumerateDeviceLayerProperties (device->device,
|
|
&priv->n_available_layers, NULL);
|
|
if (gst_vulkan_error_to_g_error (err, error,
|
|
"vkEnumerateDeviceLayerProperties") < 0)
|
|
goto error;
|
|
|
|
priv->available_layers = g_new0 (VkLayerProperties, priv->n_available_layers);
|
|
err =
|
|
vkEnumerateDeviceLayerProperties (device->device,
|
|
&priv->n_available_layers, priv->available_layers);
|
|
if (gst_vulkan_error_to_g_error (err, error,
|
|
"vkEnumerateDeviceLayerProperties") < 0) {
|
|
goto error;
|
|
}
|
|
|
|
err =
|
|
vkEnumerateDeviceExtensionProperties (device->device, NULL,
|
|
&priv->n_available_extensions, NULL);
|
|
if (gst_vulkan_error_to_g_error (err, error,
|
|
"vkEnumerateDeviceExtensionProperties") < 0) {
|
|
goto error;
|
|
}
|
|
|
|
priv->available_extensions =
|
|
g_new0 (VkExtensionProperties, priv->n_available_extensions);
|
|
err =
|
|
vkEnumerateDeviceExtensionProperties (device->device, NULL,
|
|
&priv->n_available_extensions, priv->available_extensions);
|
|
if (gst_vulkan_error_to_g_error (err, error,
|
|
"vkEnumerateDeviceExtensionProperties") < 0) {
|
|
goto error;
|
|
}
|
|
|
|
GST_INFO_OBJECT (device, "found %u layers and %u extensions",
|
|
priv->n_available_layers, priv->n_available_extensions);
|
|
|
|
for (i = 0; i < priv->n_available_layers; i++)
|
|
GST_DEBUG_OBJECT (device, "available layer %u: %s", i,
|
|
priv->available_layers[i].layerName);
|
|
for (i = 0; i < priv->n_available_extensions; i++)
|
|
GST_DEBUG_OBJECT (device, "available extension %u: %s", i,
|
|
priv->available_extensions[i].extensionName);
|
|
|
|
vkGetPhysicalDeviceProperties (device->device, &device->properties);
|
|
#if defined (VK_API_VERSION_1_2)
|
|
if (gst_vulkan_physical_device_check_api_version (device, 1, 2, 0)) {
|
|
PFN_vkGetPhysicalDeviceProperties2 get_props2;
|
|
PFN_vkGetPhysicalDeviceMemoryProperties2 get_mem_props2;
|
|
PFN_vkGetPhysicalDeviceFeatures2 get_features2;
|
|
PFN_vkGetPhysicalDeviceQueueFamilyProperties2 get_queue_props2;
|
|
VkPhysicalDeviceMemoryProperties2 mem_properties10;
|
|
|
|
/* *INDENT-OFF* */
|
|
mem_properties10 = (VkPhysicalDeviceMemoryProperties2) {
|
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2,
|
|
.pNext = NULL,
|
|
};
|
|
/* *INDENT-ON* */
|
|
|
|
get_props2 = (PFN_vkGetPhysicalDeviceProperties2)
|
|
gst_vulkan_instance_get_proc_address (device->instance,
|
|
"vkGetPhysicalDeviceProperties2");
|
|
get_props2 (device->device, &priv->properties10);
|
|
|
|
get_mem_props2 = (PFN_vkGetPhysicalDeviceMemoryProperties2)
|
|
gst_vulkan_instance_get_proc_address (device->instance,
|
|
"vkGetPhysicalDeviceMemoryProperties2");
|
|
get_mem_props2 (device->device, &mem_properties10);
|
|
memcpy (&device->memory_properties, &mem_properties10.memoryProperties,
|
|
sizeof (device->memory_properties));
|
|
|
|
get_features2 = (PFN_vkGetPhysicalDeviceFeatures2)
|
|
gst_vulkan_instance_get_proc_address (device->instance,
|
|
"vkGetPhysicalDeviceFeatures2");
|
|
get_features2 (device->device, &priv->features10);
|
|
memcpy (&device->features, &priv->features10.features,
|
|
sizeof (device->features));
|
|
|
|
get_queue_props2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2)
|
|
gst_vulkan_instance_get_proc_address (device->instance,
|
|
"vkGetPhysicalDeviceQueueFamilyProperties2");
|
|
get_queue_props2 (device->device, &device->n_queue_families, NULL);
|
|
if (device->n_queue_families > 0) {
|
|
VkQueueFamilyProperties2 *props;
|
|
int i;
|
|
void *next = NULL;
|
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
|
VkQueueFamilyVideoPropertiesKHR *queue_family_video_props;
|
|
VkQueueFamilyQueryResultStatusPropertiesKHR *queue_family_query_props;
|
|
|
|
queue_family_video_props =
|
|
g_new0 (VkQueueFamilyVideoPropertiesKHR, device->n_queue_families);
|
|
queue_family_query_props =
|
|
g_new0 (VkQueueFamilyQueryResultStatusPropertiesKHR,
|
|
device->n_queue_families);
|
|
#endif
|
|
props = g_new0 (VkQueueFamilyProperties2, device->n_queue_families);
|
|
for (i = 0; i < device->n_queue_families; i++) {
|
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
|
queue_family_query_props[i].sType =
|
|
VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR;
|
|
|
|
queue_family_video_props[i].sType =
|
|
VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR;
|
|
queue_family_video_props[i].pNext = &queue_family_query_props[i];
|
|
|
|
next = &queue_family_video_props[i];
|
|
#endif
|
|
props[i].sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2;
|
|
props[i].pNext = next;
|
|
}
|
|
|
|
get_queue_props2 (device->device, &device->n_queue_families, props);
|
|
|
|
device->queue_family_props =
|
|
g_new0 (VkQueueFamilyProperties, device->n_queue_families);
|
|
device->queue_family_ops =
|
|
g_new0 (GstVulkanQueueFamilyOps, device->n_queue_families);
|
|
for (i = 0; i < device->n_queue_families; i++) {
|
|
memcpy (&device->queue_family_props[i], &props[i].queueFamilyProperties,
|
|
sizeof (device->queue_family_props[i]));
|
|
|
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
|
device->queue_family_ops[i].video =
|
|
queue_family_video_props[i].videoCodecOperations;
|
|
device->queue_family_ops[i].query_result_status =
|
|
queue_family_query_props[i].queryResultStatusSupport;
|
|
#endif
|
|
}
|
|
g_free (props);
|
|
#if GST_VULKAN_HAVE_VIDEO_EXTENSIONS
|
|
g_free (queue_family_video_props);
|
|
g_free (queue_family_query_props);
|
|
#endif
|
|
}
|
|
} else
|
|
#endif
|
|
{
|
|
vkGetPhysicalDeviceMemoryProperties (device->device,
|
|
&device->memory_properties);
|
|
vkGetPhysicalDeviceFeatures (device->device, &device->features);
|
|
vkGetPhysicalDeviceQueueFamilyProperties (device->device,
|
|
&device->n_queue_families, NULL);
|
|
if (device->n_queue_families > 0) {
|
|
device->queue_family_props =
|
|
g_new0 (VkQueueFamilyProperties, device->n_queue_families);
|
|
vkGetPhysicalDeviceQueueFamilyProperties (device->device,
|
|
&device->n_queue_families, device->queue_family_props);
|
|
}
|
|
}
|
|
|
|
if (!physical_device_info (device, error))
|
|
goto error;
|
|
|
|
return TRUE;
|
|
|
|
error:
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_get_handle: (skip)
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
*
|
|
* Returns: The associated `VkPhysicalDevice` handle
|
|
*
|
|
* Since: 1.18
|
|
*/
|
|
VkPhysicalDevice
|
|
gst_vulkan_physical_device_get_handle (GstVulkanPhysicalDevice * device)
|
|
{
|
|
g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), NULL);
|
|
|
|
return device->device;
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_get_instance:
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
*
|
|
* Returns: (transfer full): The #GstVulkanInstance associated with this physical device
|
|
*
|
|
* Since: 1.18
|
|
*/
|
|
GstVulkanInstance *
|
|
gst_vulkan_physical_device_get_instance (GstVulkanPhysicalDevice * device)
|
|
{
|
|
g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), NULL);
|
|
|
|
return gst_object_ref (device->instance);
|
|
}
|
|
|
|
static gboolean
|
|
gst_vulkan_physical_device_get_layer_info_unlocked (GstVulkanPhysicalDevice *
|
|
device, const gchar * name, gchar ** description, guint32 * spec_version,
|
|
guint32 * implementation_version)
|
|
{
|
|
GstVulkanPhysicalDevicePrivate *priv;
|
|
int i;
|
|
|
|
priv = GET_PRIV (device);
|
|
|
|
for (i = 0; i < priv->n_available_layers; i++) {
|
|
if (g_strcmp0 (name, priv->available_layers[i].layerName) == 0) {
|
|
if (description)
|
|
*description = g_strdup (priv->available_layers[i].description);
|
|
if (spec_version)
|
|
*spec_version = priv->available_layers[i].specVersion;
|
|
if (implementation_version)
|
|
*spec_version = priv->available_layers[i].implementationVersion;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_get_layer_info:
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
* @name: the layer name to look for
|
|
* @description: (out) (nullable): return value for the layer description or %NULL
|
|
* @spec_version: (out) (nullable): return value for the layer specification version
|
|
* @implementation_version: (out) (nullable): return value for the layer implementation version
|
|
*
|
|
* Retrieves information about a layer.
|
|
*
|
|
* Will not find any layers before gst_vulkan_instance_fill_info() has been
|
|
* called.
|
|
*
|
|
* Returns: whether layer @name is available
|
|
*
|
|
* Since: 1.18
|
|
*/
|
|
gboolean
|
|
gst_vulkan_physical_device_get_layer_info (GstVulkanPhysicalDevice * device,
|
|
const gchar * name, gchar ** description, guint32 * spec_version,
|
|
guint32 * implementation_version)
|
|
{
|
|
gboolean ret;
|
|
|
|
g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), FALSE);
|
|
g_return_val_if_fail (name != NULL, FALSE);
|
|
|
|
GST_OBJECT_LOCK (device);
|
|
ret =
|
|
gst_vulkan_physical_device_get_layer_info_unlocked (device, name,
|
|
description, spec_version, implementation_version);
|
|
GST_OBJECT_UNLOCK (device);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static gboolean
|
|
gst_vulkan_physical_device_get_extension_info_unlocked (GstVulkanPhysicalDevice
|
|
* device, const gchar * name, guint32 * spec_version)
|
|
{
|
|
GstVulkanPhysicalDevicePrivate *priv;
|
|
int i;
|
|
|
|
priv = GET_PRIV (device);
|
|
|
|
for (i = 0; i < priv->n_available_extensions; i++) {
|
|
if (g_strcmp0 (name, priv->available_extensions[i].extensionName) == 0) {
|
|
if (spec_version)
|
|
*spec_version = priv->available_extensions[i].specVersion;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_get_extension_info:
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
* @name: the extension name to look for
|
|
* @spec_version: (out) (nullable): return value for the exteion specification version
|
|
*
|
|
* Retrieves information about a device extension.
|
|
*
|
|
* Will not find any extensions before gst_vulkan_instance_fill_info() has been
|
|
* called.
|
|
*
|
|
* Returns: whether extension @name is available
|
|
*
|
|
* Since: 1.18
|
|
*/
|
|
gboolean
|
|
gst_vulkan_physical_device_get_extension_info (GstVulkanPhysicalDevice * device,
|
|
const gchar * name, guint32 * spec_version)
|
|
{
|
|
gboolean ret;
|
|
|
|
g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), FALSE);
|
|
g_return_val_if_fail (name != NULL, FALSE);
|
|
|
|
GST_OBJECT_LOCK (device);
|
|
ret =
|
|
gst_vulkan_physical_device_get_extension_info_unlocked (device, name,
|
|
spec_version);
|
|
GST_OBJECT_UNLOCK (device);
|
|
|
|
return ret;
|
|
}
|
|
|
|
const VkPhysicalDeviceFeatures2 *
|
|
gst_vulkan_physical_device_get_features (GstVulkanPhysicalDevice * device)
|
|
{
|
|
#if defined (VK_API_VERSION_1_2)
|
|
GstVulkanPhysicalDevicePrivate *priv;
|
|
|
|
g_return_val_if_fail (GST_IS_VULKAN_PHYSICAL_DEVICE (device), FALSE);
|
|
|
|
priv = GET_PRIV (device);
|
|
if (gst_vulkan_physical_device_check_api_version (device, 1, 2, 0))
|
|
return &priv->features10;
|
|
#endif
|
|
return NULL;
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_get_api_version:
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
* @major: (out): major version
|
|
* @minor: (out): minor version
|
|
* @patch: (out): patch version
|
|
*
|
|
* Retrieves the advertised Vulkan API version of the #GstVulkanPhysicalDevice.
|
|
*
|
|
* Since: 1.26
|
|
*/
|
|
void
|
|
gst_vulkan_physical_device_get_api_version (GstVulkanPhysicalDevice * device,
|
|
guint * major, guint * minor, guint * patch)
|
|
{
|
|
if (major)
|
|
*major = VK_VERSION_MAJOR (device->properties.apiVersion);
|
|
if (minor)
|
|
*minor = VK_VERSION_MINOR (device->properties.apiVersion);
|
|
if (patch)
|
|
*patch = VK_VERSION_PATCH (device->properties.apiVersion);
|
|
}
|
|
|
|
/**
|
|
* gst_vulkan_physical_device_check_api_version:
|
|
* @device: a #GstVulkanPhysicalDevice
|
|
* @major: the API major version to check
|
|
* @minor: the API minor version to check
|
|
* @patch: the API patch version to check
|
|
*
|
|
* Note: This is the intersection of the exposed supported API version as would
|
|
* be returned by gst_vulkan_physical_device_get_api_version() and
|
|
* gst_vulkan_instance_check_version(). The latter will take into account any
|
|
* requested API version and may result in a different result than directly
|
|
* comparing against gst_vulkan_instance_get_version().
|
|
*
|
|
* Returns: whether the #GstVulkanPhysicalDevice supports the version specified
|
|
* by @major, @minor and @patch.
|
|
*
|
|
* Since: 1.26
|
|
*/
|
|
gboolean
|
|
gst_vulkan_physical_device_check_api_version (GstVulkanPhysicalDevice * device,
|
|
guint major, guint minor, guint patch)
|
|
{
|
|
return VK_MAKE_VERSION (major, minor, patch) <= device->properties.apiVersion
|
|
&& gst_vulkan_instance_check_api_version (device->instance, major, minor,
|
|
patch);
|
|
}
|