From 258487370fd840b018a404225277d74f74899c59 Mon Sep 17 00:00:00 2001 From: Niklas Haas Date: Wed, 13 Sep 2017 03:09:48 +0200 Subject: vo_gpu: vulkan: generalize SPIR-V compiler In addition to the built-in nvidia compiler, we now also support a backend based on libshaderc. shaderc is sort of like glslang except it has a C API and is available as a dynamic library. The generated SPIR-V is now cached alongside the VkPipeline in the cached_program. We use a special cache header to ensure validity of this cache before passing it blindly to the vulkan implementation, since passing invalid SPIR-V can cause all sorts of nasty things. It's also designed to self-invalidate if the compiler gets better, by offering a catch-all `int compiler_version` that implementations can use as a cache invalidation marker. --- video/out/vulkan/context.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'video/out/vulkan/context.c') diff --git a/video/out/vulkan/context.c b/video/out/vulkan/context.c index bd456d214c..d2445fbda7 100644 --- a/video/out/vulkan/context.c +++ b/video/out/vulkan/context.c @@ -16,6 +16,8 @@ */ #include "options/m_config.h" +#include "video/out/gpu/spirv.h" + #include "context.h" #include "ra_vk.h" #include "utils.h" @@ -125,6 +127,17 @@ struct priv { int last_imgidx; // the image index last acquired (for submit) }; +static const struct ra_swapchain_fns vulkan_swapchain; + +struct mpvk_ctx *ra_vk_ctx_get(struct ra_ctx *ctx) +{ + if (ctx->swapchain->fns != &vulkan_swapchain) + return NULL; + + struct priv *p = ctx->swapchain->priv; + return p->vk; +} + static bool update_swapchain_info(struct priv *p, VkSwapchainCreateInfoKHR *info) { @@ -265,6 +278,9 @@ bool ra_vk_ctx_init(struct ra_ctx *ctx, struct mpvk_ctx *vk, if (!mpvk_find_phys_device(vk, p->opts->device, ctx->opts.allow_sw)) goto error; + if (!spirv_compiler_init(ctx)) + goto error; + vk->spirv = ctx->spirv; if (!mpvk_pick_surface_format(vk)) goto error; if (!mpvk_device_init(vk, p->opts->dev_opts)) -- cgit v1.2.3