From patchwork Sun Sep 29 09:42:50 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 51921 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a59:d8ca:0:b0:48e:c0f8:d0de with SMTP id dy10csp1341048vqb; Sun, 29 Sep 2024 02:43:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCXu6fxnnzWazqi5nfkGqyX6nc7BJbUzcmVxgODqx5a2o7m+oIFg52alEef32twSJJ5HPhtTOiQswkq4Sk/RQFnf@gmail.com X-Google-Smtp-Source: AGHT+IHfCCnrVqzrSytB9B6692oSbk3ZailyNw4gtEZki8p1zXCZCs4wVRkxchdUCGJX8M9S7FGg X-Received: by 2002:a17:907:1b13:b0:a90:df6f:f087 with SMTP id a640c23a62f3a-a93c4ae03bemr788615466b.47.1727602992979; Sun, 29 Sep 2024 02:43:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1727602992; cv=none; d=google.com; s=arc-20240605; b=PoFDKebWofx6C0t2Y41nTugqOu125LOJSNZ2/bPKwG5iGSetebuGyR4LBNgEW1Sxp/ e0lO2G8j/br0SnYCpZU95iV8RINWzZu9W5uiSFwfC0YFCZkWIp7gKq57mU4fDyF+PPXT avxdDFDLbNoMNfLQClOTjXS0oVtRywjvY1PIQxX7yEy469BDvrpB0B05b0RZ+raYhlVG pDZ4vgWtZY9GrSJYOy1rWydl4QTSYWsjboyhbE7rZTJa7T+ZYhxTuyrXAHwVGgGJ4EAQ yX0DPmctuBPbiZfK9DPdp2YDHjyLDwU6Je4Zt+EYeQ3RV4obuYeJhXN6fPdHckGyI7yv rY/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding:cc:reply-to:from :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:delivered-to; bh=DCgrq55pGCYpzbKuOOrEID7XulLHQqteAHv7MqbOodY=; fh=nenT92/WZoU6unXd3J6UhGUdod4piddKfVtctNBOh6k=; b=f7t1Vl1ZnB5SxIPSd3be9Qeu81zg/e9j0jg5mdPbkFnjLAs47NST1lwJQy/UT/tZCV hVs7W3UCFayPw2lA8S46tQerOa52t0tb78xufY78ay55+i3ydiJVouHRMivEjBe6z/dz wLPcBc7KIH1oBRJxXsko3x2U3zZ1POYzOQHmQ+mF5s07ijiB1AbmhLO1FuDFvYkmZzid JRiRdXUwUZWEDk3qCGKOLTLMAGZV68wiSoaNiTaXeO0zB5GMWeiwhOFLiaeXxLX9Mo7X /vDwe7MceW7sHM1BOMMIEb5KL4qzrvQx+NrjCVBnJSvvUqVjP+wCjjrcU7RmZk7Oai91 UpfA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a640c23a62f3a-a93c29e637fsi442409466b.574.2024.09.29.02.43.11; Sun, 29 Sep 2024 02:43:12 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2DF5268DA34; Sun, 29 Sep 2024 12:43:07 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from vidala.lynne.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8D68068D5DE for ; Sun, 29 Sep 2024 12:43:00 +0300 (EEST) To: ffmpeg-devel@ffmpeg.org Date: Sun, 29 Sep 2024 11:42:50 +0200 Message-ID: <20240929094256.396352-3-dev@lynne.ee> X-Mailer: git-send-email 2.45.2.753.g447d99e1c3b In-Reply-To: <20240929094256.396352-1-dev@lynne.ee> References: <20240929094256.396352-1-dev@lynne.ee> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] vulkan: use shader objects if supported X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Lynne via ffmpeg-devel From: Lynne Reply-To: FFmpeg development discussions and patches Cc: Lynne Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: xO9tQK7YIsiG Shader objects finally allow completely independent shaders. --- libavutil/vulkan.c | 51 +++++++++++++++++++++++++++++++++++++++++++--- libavutil/vulkan.h | 5 ++--- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 71581b91a9..8b1c1eb796 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -1601,6 +1601,41 @@ static int init_compute_pipeline(FFVulkanContext *s, FFVulkanShader *shd, return 0; } +static int create_shader_object(FFVulkanContext *s, FFVulkanShader *shd, + uint8_t *spirv, size_t spirv_len, + const char *entrypoint) +{ + VkResult ret; + FFVulkanFunctions *vk = &s->vkfn; + + VkShaderCreateInfoEXT shader_obj_create = { + .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT, + .flags = shd->subgroup_info.requiredSubgroupSize ? + VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT : 0x0, + .stage = shd->stage, + .nextStage = 0, + .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT, + .pCode = spirv, + .codeSize = spirv_len, + .pName = entrypoint, + .pSetLayouts = shd->desc_layout, + .setLayoutCount = shd->nb_descriptor_sets, + .pushConstantRangeCount = shd->push_consts_num, + .pPushConstantRanges = shd->push_consts, + .pSpecializationInfo = NULL, + }; + + ret = vk->CreateShadersEXT(s->hwctx->act_dev, 1, &shader_obj_create, + s->hwctx->alloc, &shd->object); + if (ret != VK_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Unable to create shader object: %s\n", + ff_vk_ret2str(ret)); + return AVERROR_EXTERNAL; + } + + return 0; +} + static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd) { VkResult ret; @@ -1690,7 +1725,11 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, shd->bound_buffer_indices[i] = i; } - { + if (s->extensions & FF_VK_EXT_SHADER_OBJECT) { + err = create_shader_object(s, shd, spirv, spirv_len, entrypoint); + if (err < 0) + return err; + } else { VkShaderModule mod; err = create_shader_module(s, shd, &mod, spirv, spirv_len); if (err < 0) @@ -2181,8 +2220,12 @@ void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, VkDeviceSize offsets[1024]; FFVulkanShaderData *sd = get_shd_data(e, shd); - /* Bind pipeline */ - vk->CmdBindPipeline(e->buf, shd->bind_point, shd->pipeline); + if (s->extensions & FF_VK_EXT_SHADER_OBJECT) { + VkShaderStageFlagBits stages = shd->stage; + vk->CmdBindShadersEXT(e->buf, 1, &stages, &shd->object); + } else { + vk->CmdBindPipeline(e->buf, shd->bind_point, shd->pipeline); + } if (sd->nb_descriptor_sets) { if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) { @@ -2216,6 +2259,8 @@ void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd) s->hwctx->alloc); #endif + if (shd->object) + vk->DestroyShaderEXT(s->hwctx->act_dev, shd->object, s->hwctx->alloc); if (shd->pipeline) vk->DestroyPipeline(s->hwctx->act_dev, shd->pipeline, s->hwctx->alloc); if (shd->pipeline_layout) diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index 5391afa4e7..47684e600d 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -194,9 +194,8 @@ typedef struct FFVulkanShader { VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info; /* Base shader object */ - union { - VkPipeline pipeline; - }; + VkShaderEXT object; + VkPipeline pipeline; /* Pipeline layout */ VkPipelineLayout pipeline_layout;