40 VkImageUsageFlagBits usage_req;
45 vk_frames = frames_ctx->
hwctx;
46 vk_dev = device_ctx->
hwctx;
58 if (vk_frames->
tiling == VK_IMAGE_TILING_LINEAR)
71 usage_req = VK_IMAGE_USAGE_SAMPLED_BIT |
72 VK_IMAGE_USAGE_STORAGE_BIT;
76 if (vk_frames->
format[1] == VK_FORMAT_UNDEFINED &&
79 VkFormatProperties3 fprops = {
80 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,
82 VkFormatProperties2 prop = {
83 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
86 vk->GetPhysicalDeviceFormatProperties2(vk_dev->
phys_dev,
89 if (fprops.optimalTilingFeatures & VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR)
90 usage_req |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
93 if ((vk_frames->
usage & usage_req) != usage_req)
97 for (
int i = 0; sub[
i] != VK_FORMAT_UNDEFINED;
i++) {
98 VkFormatProperties2 prop = {
99 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
101 vk->GetPhysicalDeviceFormatProperties2(vk_dev->
phys_dev, sub[
i],
103 no_storage |= !(prop.formatProperties.optimalTilingFeatures &
104 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT);
124 "Vulkan filtering requires a device context!\n");
136 vk_frames = frames_ctx->
hwctx;
137 vk_frames->
tiling = VK_IMAGE_TILING_OPTIMAL;
138 vk_frames->
usage = VK_IMAGE_USAGE_SAMPLED_BIT |
139 VK_IMAGE_USAGE_STORAGE_BIT |
140 VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
149 vk_dev = device_ctx->
hwctx;
163 s->frames_ref = frames_ref;
164 s->frames = frames_ctx;
166 s->device = device_ctx;
167 s->hwctx = device_ctx->
hwctx;
185 "hardware frames context on the input.\n");
218 s->output_width,
s->output_height,
227 outlink->
w =
s->output_width;
228 outlink->
h =
s->output_height;
244 VkSampler sampler, uint32_t wgc_z,
245 void *push_src,
size_t push_size)
251 VkImageMemoryBarrier2 img_bar[37];
253 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
254 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
255 VK_IMAGE_LAYOUT_GENERAL;
262 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
263 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
266 VK_IMAGE_LAYOUT_GENERAL,
270 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
271 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
282 0, push_size, push_src);
286 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
287 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
288 VK_ACCESS_SHADER_WRITE_BIT,
289 VK_IMAGE_LAYOUT_GENERAL,
290 VK_QUEUE_FAMILY_IGNORED);
293 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
294 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
295 VK_ACCESS_SHADER_READ_BIT,
297 VK_QUEUE_FAMILY_IGNORED);
299 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
300 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
301 .pImageMemoryBarriers = img_bar,
302 .imageMemoryBarrierCount = nb_img_bar,
305 vk->CmdDispatch(exec->
buf,
319 VkSampler sampler, uint32_t wgc_z,
320 void *push_src,
size_t push_size)
327 VkImageMemoryBarrier2 img_bar[37];
329 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
330 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
331 VK_IMAGE_LAYOUT_GENERAL;
338 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
339 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
341 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
342 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
344 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
345 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
352 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
353 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
354 VK_ACCESS_SHADER_READ_BIT,
356 VK_QUEUE_FAMILY_IGNORED);
358 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
359 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
360 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
361 VK_IMAGE_LAYOUT_GENERAL,
362 VK_QUEUE_FAMILY_IGNORED);
364 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
365 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
366 VK_ACCESS_SHADER_WRITE_BIT,
367 VK_IMAGE_LAYOUT_GENERAL,
368 VK_QUEUE_FAMILY_IGNORED);
370 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
371 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
372 .pImageMemoryBarriers = img_bar,
373 .imageMemoryBarrierCount = nb_img_bar,
376 for (
int i = 0;
i < 2;
i++) {
380 VkImageView *src_views = !
i ? in_views : tmp_views;
381 VkImageView *dst_views = !
i ? tmp_views : out_views;
385 VK_IMAGE_LAYOUT_GENERAL,
388 VK_IMAGE_LAYOUT_GENERAL,
395 0, push_size, push_src);
397 vk->CmdDispatch(exec->
buf,
412 VkSampler sampler, uint32_t wgc_z,
413 void *push_src,
size_t push_size)
419 VkImageMemoryBarrier2 img_bar[128];
421 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
422 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
423 VK_IMAGE_LAYOUT_GENERAL;
431 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
432 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
434 for (
int i = 0;
i < nb_in;
i++) {
436 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
437 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
443 VK_IMAGE_LAYOUT_GENERAL,
445 for (
int i = 0;
i < nb_in;
i++)
454 0, push_size, push_src);
458 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
459 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
460 VK_ACCESS_SHADER_WRITE_BIT,
461 VK_IMAGE_LAYOUT_GENERAL,
462 VK_QUEUE_FAMILY_IGNORED);
463 for (
int i = 0;
i < nb_in;
i++)
465 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
466 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
467 VK_ACCESS_SHADER_READ_BIT,
469 VK_QUEUE_FAMILY_IGNORED);
471 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
472 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
473 .pImageMemoryBarriers = img_bar,
474 .imageMemoryBarrierCount = nb_img_bar,
477 vk->CmdDispatch(exec->
buf,