diff mbox series

[FFmpeg-devel,6/8] vulkan_glslang: add more stages, target Vulkan 1.3 and output debug info

Message ID 20241003055141.415483-6-dev@lynne.ee
State New
Headers show
Series [FFmpeg-devel,1/8] vulkan: always enable GL_EXT_scalar_block_layout | expand

Checks

Context Check Description
yinshiyou/configure_loongarch64 warning Failed to apply patch
andriy/configure_x86 warning Failed to apply patch

Commit Message

Lynne Oct. 3, 2024, 5:51 a.m. UTC
---
 libavfilter/vulkan_glslang.c | 39 +++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/vulkan_glslang.c b/libavfilter/vulkan_glslang.c
index 7ac7d6b2c4..20a00354e0 100644
--- a/libavfilter/vulkan_glslang.c
+++ b/libavfilter/vulkan_glslang.c
@@ -149,21 +149,28 @@  static int glslc_shader_compile(FFVulkanContext *s, FFVkSPIRVCompiler *ctx,
         [VK_SHADER_STAGE_VERTEX_BIT]   = GLSLANG_STAGE_VERTEX,
         [VK_SHADER_STAGE_FRAGMENT_BIT] = GLSLANG_STAGE_FRAGMENT,
         [VK_SHADER_STAGE_COMPUTE_BIT]  = GLSLANG_STAGE_COMPUTE,
+#if ((GLSLANG_VERSION_MAJOR) > 12)
+        [VK_SHADER_STAGE_TASK_BIT_EXT] = GLSLANG_STAGE_TASK,
+        [VK_SHADER_STAGE_MESH_BIT_EXT] = GLSLANG_STAGE_MESH,
+        [VK_SHADER_STAGE_RAYGEN_BIT_KHR] = GLSLANG_STAGE_RAYGEN,
+        [VK_SHADER_STAGE_INTERSECTION_BIT_KHR] = GLSLANG_STAGE_INTERSECT,
+        [VK_SHADER_STAGE_ANY_HIT_BIT_KHR] = GLSLANG_STAGE_ANYHIT,
+        [VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR] = GLSLANG_STAGE_CLOSESTHIT,
+        [VK_SHADER_STAGE_MISS_BIT_KHR] = GLSLANG_STAGE_MISS,
+        [VK_SHADER_STAGE_CALLABLE_BIT_KHR] = GLSLANG_STAGE_CALLABLE,
+#endif
     };
 
     const glslang_input_t glslc_input = {
         .language                          = GLSLANG_SOURCE_GLSL,
         .stage                             = glslc_stage[shd->stage],
         .client                            = GLSLANG_CLIENT_VULKAN,
-        /* GLSLANG_TARGET_VULKAN_1_2 before 11.6 resulted in targeting 1.0 */
-#if (((GLSLANG_VERSION_MAJOR) > 11) || ((GLSLANG_VERSION_MAJOR) == 11 && \
-    (((GLSLANG_VERSION_MINOR) >  6) || ((GLSLANG_VERSION_MINOR) ==  6 && \
-     ((GLSLANG_VERSION_PATCH) > 0)))))
+#if ((GLSLANG_VERSION_MAJOR) >= 12)
+        .client_version                    = GLSLANG_TARGET_VULKAN_1_3,
+        .target_language_version           = GLSLANG_TARGET_SPV_1_6,
+#else
         .client_version                    = GLSLANG_TARGET_VULKAN_1_2,
         .target_language_version           = GLSLANG_TARGET_SPV_1_5,
-#else
-        .client_version                    = GLSLANG_TARGET_VULKAN_1_1,
-        .target_language_version           = GLSLANG_TARGET_SPV_1_3,
 #endif
         .target_language                   = GLSLANG_TARGET_SPV,
         .code                              = shd->src.str,
@@ -175,6 +182,20 @@  static int glslc_shader_compile(FFVulkanContext *s, FFVkSPIRVCompiler *ctx,
         .resource                          = &glslc_resource_limits,
     };
 
+#if ((GLSLANG_VERSION_MAJOR) >= 12)
+    glslang_spv_options_t glslc_opts = {
+        .generate_debug_info = (s->extensions & FF_VK_EXT_DEBUG_UTILS),
+        .emit_nonsemantic_shader_debug_info = (s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR),
+        .emit_nonsemantic_shader_debug_source = (s->extensions & FF_VK_EXT_RELAXED_EXTENDED_INSTR),
+        .disable_optimizer = (s->extensions & FF_VK_EXT_DEBUG_UTILS),
+        .strip_debug_info = !(s->extensions & FF_VK_EXT_DEBUG_UTILS),
+        .optimize_size = 0,
+        .disassemble = 0,
+        .validate = 1,
+        .compile_only = 0,
+    };
+#endif
+
     av_assert0(glslc_refcount);
 
     *opaque = NULL;
@@ -218,7 +239,11 @@  static int glslc_shader_compile(FFVulkanContext *s, FFVkSPIRVCompiler *ctx,
         return AVERROR(EINVAL);
     }
 
+#if ((GLSLANG_VERSION_MAJOR) >= 12)
+    glslang_program_SPIRV_generate_with_options(glslc_program, glslc_input.stage, &glslc_opts);
+#else
     glslang_program_SPIRV_generate(glslc_program, glslc_input.stage);
+#endif
 
     messages = glslang_program_SPIRV_get_messages(glslc_program);
     if (messages) {