Lines Matching refs:pl
364 int ff_vk_add_push_constant(FFVulkanPipeline *pl, int offset, int size,
369 pl->push_consts = av_realloc_array(pl->push_consts, sizeof(*pl->push_consts),
370 pl->push_consts_num + 1);
371 if (!pl->push_consts)
374 pc = &pl->push_consts[pl->push_consts_num++];
795 FFVkSPIRVShader *ff_vk_init_shader(FFVulkanPipeline *pl, const char *name,
798 FFVkSPIRVShader *shd = create_shader(pl);
923 int ff_vk_add_descriptor_set(FFVulkanContext *s, FFVulkanPipeline *pl,
934 pl->desc_layout = av_realloc_array(pl->desc_layout, sizeof(*pl->desc_layout),
935 pl->desc_layout_num + pl->qf->nb_queues);
936 if (!pl->desc_layout)
939 pl->desc_set_initialized = av_realloc_array(pl->desc_set_initialized,
940 sizeof(*pl->desc_set_initialized),
941 pl->descriptor_sets_num + 1);
942 if (!pl->desc_set_initialized)
945 pl->desc_set_initialized[pl->descriptor_sets_num] = 0;
946 layout = &pl->desc_layout[pl->desc_layout_num];
970 for (int i = 0; i < pl->qf->nb_queues; i++) {
987 for (j = 0; j < pl->pool_size_desc_num; j++)
988 if (pl->pool_size_desc[j].type == desc[i].type)
990 if (j >= pl->pool_size_desc_num) {
991 pl->pool_size_desc = av_realloc_array(pl->pool_size_desc,
992 sizeof(*pl->pool_size_desc),
993 ++pl->pool_size_desc_num);
994 if (!pl->pool_size_desc)
996 memset(&pl->pool_size_desc[j], 0, sizeof(VkDescriptorPoolSize));
998 pl->pool_size_desc[j].type = desc[i].type;
999 pl->pool_size_desc[j].descriptorCount += FFMAX(desc[i].elems, 1)*pl->qf->nb_queues;
1021 pl->desc_template_info = av_realloc_array(pl->desc_template_info,
1022 sizeof(*pl->desc_template_info),
1023 pl->total_descriptor_sets + pl->qf->nb_queues);
1024 if (!pl->desc_template_info)
1027 dt = &pl->desc_template_info[pl->total_descriptor_sets];
1028 memset(dt, 0, sizeof(*dt)*pl->qf->nb_queues);
1030 for (int i = 0; i < pl->qf->nb_queues; i++) {
1039 pl->descriptor_sets_num++;
1041 pl->desc_layout_num += pl->qf->nb_queues;
1042 pl->total_descriptor_sets += pl->qf->nb_queues;
1048 GLSLA("layout (set = %i, binding = %i", pl->descriptor_sets_num - 1, i);
1080 void ff_vk_update_descriptor_set(FFVulkanContext *s, FFVulkanPipeline *pl,
1086 if (!pl->desc_set_initialized[set_id]) {
1087 for (int i = 0; i < pl->qf->nb_queues; i++) {
1088 int idx = set_id*pl->qf->nb_queues + i;
1090 pl->desc_set[idx],
1091 pl->desc_template[idx],
1094 pl->desc_set_initialized[set_id] = 1;
1098 set_id = set_id*pl->qf->nb_queues + pl->qf->cur_queue;
1101 pl->desc_set[set_id],
1102 pl->desc_template[set_id],
1116 int ff_vk_init_pipeline_layout(FFVulkanContext *s, FFVulkanPipeline *pl)
1121 pl->desc_staging = av_malloc(pl->descriptor_sets_num*sizeof(*pl->desc_staging));
1122 if (!pl->desc_staging)
1128 .poolSizeCount = pl->pool_size_desc_num,
1129 .pPoolSizes = pl->pool_size_desc,
1130 .maxSets = pl->total_descriptor_sets,
1134 s->hwctx->alloc, &pl->desc_pool);
1135 av_freep(&pl->pool_size_desc);
1146 .descriptorPool = pl->desc_pool,
1147 .descriptorSetCount = pl->total_descriptor_sets,
1148 .pSetLayouts = pl->desc_layout,
1151 pl->desc_set = av_malloc(pl->total_descriptor_sets*sizeof(*pl->desc_set));
1152 if (!pl->desc_set)
1156 pl->desc_set);
1167 .pSetLayouts = (VkDescriptorSetLayout *)pl->desc_staging,
1168 .pushConstantRangeCount = pl->push_consts_num,
1169 .pPushConstantRanges = pl->push_consts,
1172 for (int i = 0; i < pl->total_descriptor_sets; i += pl->qf->nb_queues)
1173 pl->desc_staging[spawn_pipeline_layout.setLayoutCount++] = pl->desc_layout[i];
1176 s->hwctx->alloc, &pl->pipeline_layout);
1177 av_freep(&pl->push_consts);
1178 pl->push_consts_num = 0;
1189 pl->desc_template = av_malloc(pl->total_descriptor_sets*sizeof(*pl->desc_template));
1190 if (!pl->desc_template)
1194 for (int i = 0; i < pl->total_descriptor_sets; i++) {
1195 dt = &pl->desc_template_info[i];
1196 dt->pipelineLayout = pl->pipeline_layout;
1199 &pl->desc_template[i]);
1208 for (int i = 0; i < pl->total_descriptor_sets; i += pl->qf->nb_queues) {
1209 dt = &pl->desc_template_info[i];
1213 av_freep(&pl->desc_template_info);
1222 FFVulkanPipeline *pl = create_pipeline(s);
1223 if (pl)
1224 pl->qf = qf;
1226 return pl;
1229 int ff_vk_init_compute_pipeline(FFVulkanContext *s, FFVulkanPipeline *pl)
1237 .layout = pl->pipeline_layout,
1240 for (i = 0; i < pl->shaders_num; i++) {
1241 if (pl->shaders[i]->shader.stage & VK_SHADER_STAGE_COMPUTE_BIT) {
1242 pipe.stage = pl->shaders[i]->shader;
1246 if (i == pl->shaders_num) {
1252 s->hwctx->alloc, &pl->pipeline);
1259 pl->bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
1265 FFVulkanPipeline *pl)
1269 vk->CmdBindPipeline(e->bufs[e->qf->cur_queue], pl->bind_point, pl->pipeline);
1271 for (int i = 0; i < pl->descriptor_sets_num; i++)
1272 pl->desc_staging[i] = pl->desc_set[i*pl->qf->nb_queues + pl->qf->cur_queue];
1274 vk->CmdBindDescriptorSets(e->bufs[e->qf->cur_queue], pl->bind_point,
1275 pl->pipeline_layout, 0,
1276 pl->descriptor_sets_num,
1277 (VkDescriptorSet *)pl->desc_staging,
1280 e->bound_pl = pl;
1327 static void free_pipeline(FFVulkanContext *s, FFVulkanPipeline *pl)
1331 for (int i = 0; i < pl->shaders_num; i++) {
1332 FFVkSPIRVShader *shd = pl->shaders[i];
1339 vk->DestroyPipeline(s->hwctx->act_dev, pl->pipeline, s->hwctx->alloc);
1340 vk->DestroyPipelineLayout(s->hwctx->act_dev, pl->pipeline_layout,
1343 for (int i = 0; i < pl->desc_layout_num; i++) {
1344 if (pl->desc_template && pl->desc_template[i])
1345 vk->DestroyDescriptorUpdateTemplate(s->hwctx->act_dev, pl->desc_template[i],
1347 if (pl->desc_layout && pl->desc_layout[i])
1348 vk->DestroyDescriptorSetLayout(s->hwctx->act_dev, pl->desc_layout[i],
1353 if (pl->desc_pool)
1354 vk->DestroyDescriptorPool(s->hwctx->act_dev, pl->desc_pool,
1357 av_freep(&pl->desc_staging);
1358 av_freep(&pl->desc_set);
1359 av_freep(&pl->shaders);
1360 av_freep(&pl->desc_layout);
1361 av_freep(&pl->desc_template);
1362 av_freep(&pl->desc_set_initialized);
1363 av_freep(&pl->push_consts);
1364 pl->push_consts_num = 0;
1367 av_freep(&pl->pool_size_desc);
1368 if (pl->desc_template_info) {
1369 for (int i = 0; i < pl->total_descriptor_sets; i += pl->qf->nb_queues) {
1370 VkDescriptorUpdateTemplateCreateInfo *dt = &pl->desc_template_info[i];
1373 av_freep(&pl->desc_template_info);
1376 av_free(pl);