summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLynne <dev@lynne.ee>2020-05-13 16:39:00 +0100
committerLynne <dev@lynne.ee>2020-05-23 19:07:30 +0100
commitea1a7f6064e1565f6976544be65c77a215e4a883 (patch)
tree8eff4a5cfbb535c7df22d2a74e7ed73424b1cfc2
parent01c7539f30a38d15fd767dd1a236b6fcced02db8 (diff)
hwcontext_vulkan: expose the enabled device features
With this, the puzzle of making libplacebo, ffmpeg and any other Vulkan API users interoperable is complete. Users of both libraries can initialize one another's contexts without having to create a new one.
-rw-r--r--libavutil/hwcontext_vulkan.c11
-rw-r--r--libavutil/hwcontext_vulkan.h7
2 files changed, 18 insertions, 0 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 2fb9c5dbfa..83de4b5cb7 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -807,6 +807,7 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
AVDictionaryEntry *opt_d;
VulkanDevicePriv *p = ctx->internal->priv;
AVVulkanDeviceContext *hwctx = ctx->hwctx;
+ VkPhysicalDeviceFeatures dev_features = { 0 };
VkDeviceQueueCreateInfo queue_create_info[3] = {
{ .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, },
{ .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, },
@@ -815,10 +816,12 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
VkDeviceCreateInfo dev_info = {
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
+ .pNext = &hwctx->device_features,
.pQueueCreateInfos = queue_create_info,
.queueCreateInfoCount = 0,
};
+ hwctx->device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
ctx->free = vulkan_device_free;
/* Create an instance if not given one */
@@ -839,6 +842,14 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
av_log(ctx, AV_LOG_VERBOSE, " minMemoryMapAlignment: %li\n",
p->props.limits.minMemoryMapAlignment);
+ vkGetPhysicalDeviceFeatures(hwctx->phys_dev, &dev_features);
+#define COPY_FEATURE(DST, NAME) (DST).features.NAME = dev_features.NAME;
+ COPY_FEATURE(hwctx->device_features, shaderImageGatherExtended)
+ COPY_FEATURE(hwctx->device_features, fragmentStoresAndAtomics)
+ COPY_FEATURE(hwctx->device_features, vertexPipelineStoresAndAtomics)
+ COPY_FEATURE(hwctx->device_features, shaderInt64)
+#undef COPY_FEATURE
+
/* Search queue family */
if ((err = search_queue_families(ctx, &dev_info)))
goto end;
diff --git a/libavutil/hwcontext_vulkan.h b/libavutil/hwcontext_vulkan.h
index 9fbe8b9dcb..b7399d5636 100644
--- a/libavutil/hwcontext_vulkan.h
+++ b/libavutil/hwcontext_vulkan.h
@@ -94,6 +94,13 @@ typedef struct AVVulkanDeviceContext {
*/
const char * const *enabled_dev_extensions;
int nb_enabled_dev_extensions;
+ /**
+ * This structure should be set to the set of features that present and enabled
+ * during device creation. When a device is created by FFmpeg, it will default to
+ * enabling all that are present of the shaderImageGatherExtended,
+ * fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features.
+ */
+ VkPhysicalDeviceFeatures2 device_features;
} AVVulkanDeviceContext;
/**