hwcontext_vulkan: enable VK_KHR_shader_relaxed_extended_instruction

This commit is contained in:
Lynne 2024-10-03 04:27:53 +02:00
parent 0d5bfd0b21
commit 535e5eb7f3
No known key found for this signature in database
GPG Key ID: A2FEA5F03F034464
4 changed files with 43 additions and 0 deletions

View File

@ -100,6 +100,9 @@ typedef struct VulkanDevicePriv {
VkPhysicalDeviceOpticalFlowFeaturesNV optical_flow_features;
VkPhysicalDeviceShaderObjectFeaturesEXT shader_object_features;
VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maint_1_features;
#ifdef VK_KHR_shader_relaxed_extended_instruction
VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instr_features;
#endif
/* Queues */
pthread_mutex_t **qf_mutex;
@ -622,6 +625,28 @@ static int check_extensions(AVHWDeviceContext *ctx, int dev, AVDictionary *opts,
}
}
#ifdef VK_KHR_shader_relaxed_extended_instruction
if (dev && debug_mode == FF_VULKAN_DEBUG_PRINTF) {
tstr = VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME;
found = 0;
for (int j = 0; j < sup_ext_count; j++) {
if (!strcmp(tstr, sup_ext[j].extensionName)) {
found = 1;
break;
}
}
if (found) {
av_log(ctx, AV_LOG_VERBOSE, "Using %s extension %s\n", mod, tstr);
ADD_VAL_TO_LIST(extension_names, extensions_found, tstr);
} else {
av_log(ctx, AV_LOG_ERROR, "Debug printf enabled, but extension \"%s\" not found!\n",
tstr);
err = AVERROR(EINVAL);
goto fail;
}
#endif
}
if (user_exts_str) {
char *save, *token = av_strtok(user_exts_str, "+", &save);
while (token) {
@ -1419,9 +1444,19 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
VkPhysicalDeviceTimelineSemaphoreFeatures timeline_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
};
#ifdef VK_KHR_shader_relaxed_extended_instruction
VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instr_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR,
.pNext = &timeline_features,
};
#endif
VkPhysicalDeviceVideoMaintenance1FeaturesKHR video_maint_1_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR,
#ifdef VK_KHR_shader_relaxed_extended_instruction
.pNext = &relaxed_extended_instr_features,
#else
.pNext = &timeline_features,
#endif
};
VkPhysicalDeviceShaderObjectFeaturesEXT shader_object_features = {
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT,
@ -1535,6 +1570,10 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
p->shader_object_features.shaderObject = shader_object_features.shaderObject;
#ifdef VK_KHR_shader_relaxed_extended_instruction
p->relaxed_extended_instr_features.shaderRelaxedExtendedInstruction = relaxed_extended_instr_features.shaderRelaxedExtendedInstruction;
#endif
/* Find and enable extensions */
if ((err = check_extensions(ctx, 1, opts, &dev_info.ppEnabledExtensionNames,
&dev_info.enabledExtensionCount, debug_mode))) {

View File

@ -1481,6 +1481,8 @@ int ff_vk_shader_init(FFVulkanContext *s, FFVulkanShader *shd, const char *name,
GLSLC(0, #extension GL_EXT_scalar_block_layout : require );
GLSLC(0, #extension GL_EXT_buffer_reference : require );
GLSLC(0, #extension GL_EXT_buffer_reference2 : require );
if (s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR)
GLSLC(0, #extension GL_EXT_debug_printf : require );
if (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
stage == VK_SHADER_STAGE_MESH_BIT_EXT)

View File

@ -47,6 +47,7 @@ typedef uint64_t FFVulkanExtensions;
#define FF_VK_EXT_OPTICAL_FLOW (1ULL << 12) /* VK_NV_optical_flow */
#define FF_VK_EXT_SHADER_OBJECT (1ULL << 13) /* VK_EXT_shader_object */
#define FF_VK_EXT_PUSH_DESCRIPTOR (1ULL << 14) /* VK_KHR_push_descriptor */
#define FF_VK_EXT_RELAXED_EXTENDED_INSTR (1ULL << 15) /* VK_KHR_shader_relaxed_extended_instruction */
/* Video extensions */
#define FF_VK_EXT_VIDEO_QUEUE (1ULL << 36) /* VK_KHR_video_queue */

View File

@ -40,6 +40,7 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
const char *name;
FFVulkanExtensions flag;
} extension_map[] = {
{ VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME, FF_VK_EXT_RELAXED_EXTENDED_INSTR },
{ VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_DMABUF_MEMORY },
{ VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME, FF_VK_EXT_DRM_MODIFIER_FLAGS },
{ VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_FD_MEMORY },