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,
void *push_src,
size_t push_size)
250 VkImageMemoryBarrier2 img_bar[37];
252 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
253 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
254 VK_IMAGE_LAYOUT_GENERAL;
261 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
262 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
265 VK_IMAGE_LAYOUT_GENERAL,
269 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
270 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
281 0, push_size, push_src);
285 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
286 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
287 VK_ACCESS_SHADER_WRITE_BIT,
288 VK_IMAGE_LAYOUT_GENERAL,
289 VK_QUEUE_FAMILY_IGNORED);
292 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
293 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
294 VK_ACCESS_SHADER_READ_BIT,
296 VK_QUEUE_FAMILY_IGNORED);
298 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
299 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
300 .pImageMemoryBarriers = img_bar,
301 .imageMemoryBarrierCount = nb_img_bar,
304 vk->CmdDispatch(exec->
buf,
318 VkSampler sampler,
void *push_src,
size_t push_size)
325 VkImageMemoryBarrier2 img_bar[37];
327 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
328 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
329 VK_IMAGE_LAYOUT_GENERAL;
336 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
337 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
339 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
340 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
342 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
343 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
350 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
351 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
352 VK_ACCESS_SHADER_READ_BIT,
354 VK_QUEUE_FAMILY_IGNORED);
356 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
357 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
358 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
359 VK_IMAGE_LAYOUT_GENERAL,
360 VK_QUEUE_FAMILY_IGNORED);
362 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
363 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
364 VK_ACCESS_SHADER_WRITE_BIT,
365 VK_IMAGE_LAYOUT_GENERAL,
366 VK_QUEUE_FAMILY_IGNORED);
368 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
369 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
370 .pImageMemoryBarriers = img_bar,
371 .imageMemoryBarrierCount = nb_img_bar,
374 for (
int i = 0;
i < 2;
i++) {
378 VkImageView *src_views = !
i ? in_views : tmp_views;
379 VkImageView *dst_views = !
i ? tmp_views : out_views;
383 VK_IMAGE_LAYOUT_GENERAL,
386 VK_IMAGE_LAYOUT_GENERAL,
393 0, push_size, push_src);
395 vk->CmdDispatch(exec->
buf,
410 VkSampler sampler,
void *push_src,
size_t push_size)
416 VkImageMemoryBarrier2 img_bar[128];
418 VkImageLayout in_layout = sampler != VK_NULL_HANDLE ?
419 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
420 VK_IMAGE_LAYOUT_GENERAL;
428 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
429 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
431 for (
int i = 0;
i < nb_in;
i++) {
433 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
434 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
440 VK_IMAGE_LAYOUT_GENERAL,
442 for (
int i = 0;
i < nb_in;
i++)
451 0, push_size, push_src);
455 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
456 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
457 VK_ACCESS_SHADER_WRITE_BIT,
458 VK_IMAGE_LAYOUT_GENERAL,
459 VK_QUEUE_FAMILY_IGNORED);
460 for (
int i = 0;
i < nb_in;
i++)
462 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
463 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
464 VK_ACCESS_SHADER_READ_BIT,
466 VK_QUEUE_FAMILY_IGNORED);
468 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
469 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
470 .pImageMemoryBarriers = img_bar,
471 .imageMemoryBarrierCount = nb_img_bar,
474 vk->CmdDispatch(exec->
buf,