summaryrefslogtreecommitdiff
path: root/libavfilter/vulkan.c
diff options
context:
space:
mode:
authorLynne <dev@lynne.ee>2021-11-08 09:31:05 +0100
committerLynne <dev@lynne.ee>2021-11-12 05:23:41 +0100
commit246f841b53e16f2cccf3101cb61c264014f54e5c (patch)
tree6850f70277522b919b3b14d7b312e8bf960a4cac /libavfilter/vulkan.c
parentfef85c376adabc15715ed8d9c53cc8e889c9c7dc (diff)
downloadffmpeg-246f841b53e16f2cccf3101cb61c264014f54e5c.tar.gz
lavfi/glslang: migrate to the C API and robustify library detection
Finally, this is as close to usable as it gets for glslang. Much faster to compile as well, and eliminates the need for a C++ compiler, which is great. Also, changes to the resource limits won't break users, as we can use designated initializers in C90.
Diffstat (limited to 'libavfilter/vulkan.c')
-rw-r--r--libavfilter/vulkan.c63
1 files changed, 24 insertions, 39 deletions
diff --git a/libavfilter/vulkan.c b/libavfilter/vulkan.c
index 4ac8e5e90a..c9a2ae4593 100644
--- a/libavfilter/vulkan.c
+++ b/libavfilter/vulkan.c
@@ -794,7 +794,7 @@ int ff_vk_filter_init(AVFilterContext *avctx)
s->output_format = AV_PIX_FMT_NONE;
- if (glslang_init())
+ if (ff_vk_glslang_init())
return AVERROR_EXTERNAL;
return 0;
@@ -924,11 +924,11 @@ int ff_vk_create_imageview(AVFilterContext *avctx, FFVkExecContext *e,
return 0;
}
-FN_CREATING(VulkanPipeline, SPIRVShader, shader, shaders, shaders_num)
-SPIRVShader *ff_vk_init_shader(AVFilterContext *avctx, VulkanPipeline *pl,
- const char *name, VkShaderStageFlags stage)
+FN_CREATING(VulkanPipeline, FFSPIRVShader, shader, shaders, shaders_num)
+FFSPIRVShader *ff_vk_init_shader(AVFilterContext *avctx, VulkanPipeline *pl,
+ const char *name, VkShaderStageFlags stage)
{
- SPIRVShader *shd = create_shader(pl);
+ FFSPIRVShader *shd = create_shader(pl);
if (!shd)
return NULL;
@@ -946,7 +946,7 @@ SPIRVShader *ff_vk_init_shader(AVFilterContext *avctx, VulkanPipeline *pl,
return shd;
}
-void ff_vk_set_compute_shader_sizes(AVFilterContext *avctx, SPIRVShader *shd,
+void ff_vk_set_compute_shader_sizes(AVFilterContext *avctx, FFSPIRVShader *shd,
int local_size[3])
{
shd->local_size[0] = local_size[0];
@@ -958,7 +958,7 @@ void ff_vk_set_compute_shader_sizes(AVFilterContext *avctx, SPIRVShader *shd,
shd->local_size[0], shd->local_size[1], shd->local_size[2]);
}
-static void print_shader(AVFilterContext *avctx, SPIRVShader *shd, int prio)
+void ff_vk_print_shader(AVFilterContext *avctx, FFSPIRVShader *shd, int prio)
{
int line = 0;
const char *p = shd->src.str;
@@ -979,51 +979,39 @@ static void print_shader(AVFilterContext *avctx, SPIRVShader *shd, int prio)
av_bprint_finalize(&buf, NULL);
}
-int ff_vk_compile_shader(AVFilterContext *avctx, SPIRVShader *shd,
+int ff_vk_compile_shader(AVFilterContext *avctx, FFSPIRVShader *shd,
const char *entrypoint)
{
+ int err;
VkResult ret;
VulkanFilterContext *s = avctx->priv;
FFVulkanFunctions *vk = &s->vkfn;
VkShaderModuleCreateInfo shader_create;
- GLSlangResult *res;
-
- static const enum GLSlangStage emap[] = {
- [VK_SHADER_STAGE_VERTEX_BIT] = GLSLANG_VERTEX,
- [VK_SHADER_STAGE_FRAGMENT_BIT] = GLSLANG_FRAGMENT,
- [VK_SHADER_STAGE_COMPUTE_BIT] = GLSLANG_COMPUTE,
- };
+ uint8_t *spirv;
+ size_t spirv_size;
+ void *priv;
shd->shader.pName = entrypoint;
- res = glslang_compile(shd->src.str, emap[shd->shader.stage]);
- if (!res)
- return AVERROR(ENOMEM);
+ err = ff_vk_glslang_shader_compile(avctx, shd, &spirv, &spirv_size, &priv);
+ if (err < 0)
+ return err;
- if (res->rval) {
- av_log(avctx, AV_LOG_ERROR, "Error compiling shader %s: %s!\n",
- shd->name, av_err2str(res->rval));
- print_shader(avctx, shd, AV_LOG_ERROR);
- if (res->error_msg)
- av_log(avctx, AV_LOG_ERROR, "%s", res->error_msg);
- av_free(res->error_msg);
- return res->rval;
- }
+ ff_vk_print_shader(avctx, shd, AV_LOG_VERBOSE);
- print_shader(avctx, shd, AV_LOG_VERBOSE);
+ av_log(avctx, AV_LOG_VERBOSE, "Shader %s compiled! Size: %zu bytes\n",
+ shd->name, spirv_size);
shader_create.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
shader_create.pNext = NULL;
- shader_create.codeSize = res->size;
+ shader_create.codeSize = spirv_size;
shader_create.flags = 0;
- shader_create.pCode = res->data;
+ shader_create.pCode = (void *)spirv;
ret = vk->CreateShaderModule(s->hwctx->act_dev, &shader_create, NULL,
&shd->shader.module);
- /* Free the GLSlangResult struct */
- av_free(res->data);
- av_free(res);
+ ff_vk_glslang_shader_free(priv);
if (ret != VK_SUCCESS) {
av_log(avctx, AV_LOG_ERROR, "Unable to create shader module: %s\n",
@@ -1031,9 +1019,6 @@ int ff_vk_compile_shader(AVFilterContext *avctx, SPIRVShader *shd,
return AVERROR_EXTERNAL;
}
- av_log(avctx, AV_LOG_VERBOSE, "Shader %s linked! Size: %zu bytes\n",
- shd->name, shader_create.codeSize);
-
return 0;
}
@@ -1059,7 +1044,7 @@ static const struct descriptor_props {
};
int ff_vk_add_descriptor_set(AVFilterContext *avctx, VulkanPipeline *pl,
- SPIRVShader *shd, VulkanDescriptorSetBinding *desc,
+ FFSPIRVShader *shd, VulkanDescriptorSetBinding *desc,
int num, int only_print_to_shader)
{
VkResult ret;
@@ -1423,7 +1408,7 @@ static void free_pipeline(VulkanFilterContext *s, VulkanPipeline *pl)
FFVulkanFunctions *vk = &s->vkfn;
for (int i = 0; i < pl->shaders_num; i++) {
- SPIRVShader *shd = pl->shaders[i];
+ FFSPIRVShader *shd = pl->shaders[i];
av_bprint_finalize(&shd->src, NULL);
vk->DestroyShaderModule(s->hwctx->act_dev, shd->shader.module,
s->hwctx->alloc);
@@ -1471,7 +1456,7 @@ void ff_vk_filter_uninit(AVFilterContext *avctx)
VulkanFilterContext *s = avctx->priv;
FFVulkanFunctions *vk = &s->vkfn;
- glslang_uninit();
+ ff_vk_glslang_uninit();
for (int i = 0; i < s->exec_ctx_num; i++)
free_exec_ctx(s, s->exec_ctx[i]);