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;
161 s->frames_ref = frames_ref;
162 s->frames = frames_ctx;
164 s->device = device_ctx;
165 s->hwctx = device_ctx->
hwctx;
183 "hardware frames context on the input.\n");
216 s->output_width,
s->output_height,
225 outlink->
w =
s->output_width;
226 outlink->
h =
s->output_height;
242 VkSampler sampler,
void *push_src,
size_t push_size)
248 VkImageMemoryBarrier2 img_bar[37];
256 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
257 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
260 VK_IMAGE_LAYOUT_GENERAL,
264 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
265 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
268 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
276 0, push_size, push_src);
280 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
281 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
282 VK_ACCESS_SHADER_WRITE_BIT,
283 VK_IMAGE_LAYOUT_GENERAL,
284 VK_QUEUE_FAMILY_IGNORED);
287 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
288 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
289 VK_ACCESS_SHADER_READ_BIT,
290 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
291 VK_QUEUE_FAMILY_IGNORED);
293 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
294 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
295 .pImageMemoryBarriers = img_bar,
296 .imageMemoryBarrierCount = nb_img_bar,
299 vk->CmdDispatch(exec->
buf,
313 VkSampler sampler,
void *push_src,
size_t push_size)
320 VkImageMemoryBarrier2 img_bar[37];
328 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
329 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
331 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
332 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
334 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
335 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
342 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
343 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
344 VK_ACCESS_SHADER_READ_BIT,
345 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
346 VK_QUEUE_FAMILY_IGNORED);
348 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
349 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
350 VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT,
351 VK_IMAGE_LAYOUT_GENERAL,
352 VK_QUEUE_FAMILY_IGNORED);
354 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
355 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
356 VK_ACCESS_SHADER_WRITE_BIT,
357 VK_IMAGE_LAYOUT_GENERAL,
358 VK_QUEUE_FAMILY_IGNORED);
360 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
361 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
362 .pImageMemoryBarriers = img_bar,
363 .imageMemoryBarrierCount = nb_img_bar,
366 for (
int i = 0;
i < 2;
i++) {
370 VkImageView *src_views = !
i ? in_views : tmp_views;
371 VkImageView *dst_views = !
i ? tmp_views : out_views;
374 !
i ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL :
375 VK_IMAGE_LAYOUT_GENERAL,
378 VK_IMAGE_LAYOUT_GENERAL,
385 0, push_size, push_src);
387 vk->CmdDispatch(exec->
buf,
402 VkSampler sampler,
void *push_src,
size_t push_size)
408 VkImageMemoryBarrier2 img_bar[128];
417 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
418 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
420 for (
int i = 0;
i < nb_in;
i++) {
422 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
423 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT));
429 VK_IMAGE_LAYOUT_GENERAL,
431 for (
int i = 0;
i < nb_in;
i++)
433 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
440 0, push_size, push_src);
444 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
445 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
446 VK_ACCESS_SHADER_WRITE_BIT,
447 VK_IMAGE_LAYOUT_GENERAL,
448 VK_QUEUE_FAMILY_IGNORED);
449 for (
int i = 0;
i < nb_in;
i++)
451 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
452 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT,
453 VK_ACCESS_SHADER_READ_BIT,
454 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
455 VK_QUEUE_FAMILY_IGNORED);
457 vk->CmdPipelineBarrier2(exec->
buf, &(VkDependencyInfo) {
458 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
459 .pImageMemoryBarriers = img_bar,
460 .imageMemoryBarrierCount = nb_img_bar,
463 vk->CmdDispatch(exec->
buf,