30#if CONFIG_SHADER_COMPRESSION
35 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
36 .g = VK_COMPONENT_SWIZZLE_IDENTITY,
37 .b = VK_COMPONENT_SWIZZLE_IDENTITY,
38 .a = VK_COMPONENT_SWIZZLE_IDENTITY,
44#define CASE(VAL) case VAL: return #VAL
52 CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
53 CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
54 CASE(VK_ERROR_INITIALIZATION_FAILED);
55 CASE(VK_ERROR_DEVICE_LOST);
56 CASE(VK_ERROR_MEMORY_MAP_FAILED);
57 CASE(VK_ERROR_LAYER_NOT_PRESENT);
58 CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
59 CASE(VK_ERROR_FEATURE_NOT_PRESENT);
60 CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
61 CASE(VK_ERROR_TOO_MANY_OBJECTS);
62 CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
63 CASE(VK_ERROR_FRAGMENTED_POOL);
64 CASE(VK_ERROR_UNKNOWN);
65 CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
66 CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
67 CASE(VK_ERROR_FRAGMENTATION);
68 CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
69 CASE(VK_PIPELINE_COMPILE_REQUIRED);
70 CASE(VK_ERROR_SURFACE_LOST_KHR);
71 CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
72 CASE(VK_SUBOPTIMAL_KHR);
73 CASE(VK_ERROR_OUT_OF_DATE_KHR);
74 CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
75 CASE(VK_ERROR_VALIDATION_FAILED_EXT);
76 CASE(VK_ERROR_INVALID_SHADER_NV);
77 CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR);
78 CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR);
79 CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR);
80 CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR);
81 CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR);
82 CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
83 CASE(VK_ERROR_NOT_PERMITTED_KHR);
84 CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
85 CASE(VK_THREAD_IDLE_KHR);
86 CASE(VK_THREAD_DONE_KHR);
87 CASE(VK_OPERATION_DEFERRED_KHR);
88 CASE(VK_OPERATION_NOT_DEFERRED_KHR);
89 default:
return "Unknown error";
95#define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \
96 dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \
99 MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \
100 VK_IMAGE_USAGE_SAMPLED_BIT); \
101 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \
102 VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \
103 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \
104 VK_IMAGE_USAGE_TRANSFER_DST_BIT); \
105 MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \
106 VK_IMAGE_USAGE_STORAGE_BIT); \
107 MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \
108 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \
109 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \
110 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \
111 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \
112 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \
113 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \
114 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \
115 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \
116 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \
117 MAP_TO(VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT, \
118 VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT); \
122#define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1;
123FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags,
usage)
125#define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2;
126FN_MAP_TO(VkImageUsageFlags,
usage, VkFormatFeatureFlagBits2, feats)
133 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
136 for (
int j = 0; j <
s->nb_qfs; j++) {
137 if (
s->qfs[j] ==
s->hwctx->qf[
i].idx) {
145 s->qfs[
s->nb_qfs++] =
s->hwctx->qf[
i].idx;
155 s->props = (VkPhysicalDeviceProperties2) {
156 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
160 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES);
162 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
164 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES);
167 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR);
169 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
171 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
173 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
175 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT);
177#ifdef VK_EXT_shader_long_vector
179 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT);
182 s->feats = (VkPhysicalDeviceFeatures2) {
183 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
187 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
189 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
190#ifdef VK_KHR_unified_image_layouts
192 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR);
195 if (!
s->imageviews_pool) {
199 if (!
s->imageviews_pool)
204 s->host_image_copy_layouts =
av_malloc(
sizeof(*
s->host_image_copy_layouts)*1024);
205 s->host_image_props.pCopySrcLayouts =
s->host_image_copy_layouts;
206 s->host_image_props.copySrcLayoutCount = 512;
207 s->host_image_props.pCopyDstLayouts =
s->host_image_copy_layouts + 512;
208 s->host_image_props.copyDstLayoutCount = 512;
210 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
213 if (
s->host_image_props.copySrcLayoutCount == 512 ||
214 s->host_image_props.copyDstLayoutCount == 512) {
215 VkImageLayout *new_array;
217 s->host_image_props.pCopySrcLayouts =
218 s->host_image_props.pCopyDstLayouts =
NULL;
219 s->host_image_props.copySrcLayoutCount =
220 s->host_image_props.copyDstLayoutCount = 0;
221 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
223 new_size =
s->host_image_props.copySrcLayoutCount +
224 s->host_image_props.copyDstLayoutCount;
225 new_size *=
sizeof(*
s->host_image_copy_layouts);
226 new_array =
av_realloc(
s->host_image_copy_layouts, new_size);
230 s->host_image_copy_layouts = new_array;
231 s->host_image_props.pCopySrcLayouts = new_array;
232 s->host_image_props.pCopyDstLayouts = new_array +
s->host_image_props.copySrcLayoutCount;
233 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
236 vk->GetPhysicalDeviceMemoryProperties(
s->hwctx->phys_dev, &
s->mprops);
237 vk->GetPhysicalDeviceFeatures2(
s->hwctx->phys_dev, &
s->feats);
239 for (
int i = 0;
i <
s->mprops.memoryTypeCount;
i++)
240 s->host_cached_flag |=
s->mprops.memoryTypes[
i].propertyFlags &
241 VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
248 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
NULL);
250 s->qf_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->qf_props));
254 s->query_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->query_props));
260 s->video_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->video_props));
261 if (!
s->video_props) {
267#ifdef VK_KHR_maintenance9
268 s->ownership_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->ownership_props));
269 if (!
s->ownership_props) {
277 for (uint32_t
i = 0;
i <
s->tot_nb_qfs;
i++) {
278 s->qf_props[
i] = (VkQueueFamilyProperties2) {
279 .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
283 VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR);
285 VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR);
286#ifdef VK_KHR_maintenance9
288 VK_STRUCTURE_TYPE_QUEUE_FAMILY_OWNERSHIP_TRANSFER_PROPERTIES_KHR);
292 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
s->qf_props);
295 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
296 &
s->coop_mat_props_nb,
NULL);
298 if (
s->coop_mat_props_nb) {
300 sizeof(VkCooperativeMatrixPropertiesKHR));
301 for (
int i = 0;
i <
s->coop_mat_props_nb;
i++) {
302 s->coop_mat_props[
i] = (VkCooperativeMatrixPropertiesKHR) {
303 .sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
307 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
308 &
s->coop_mat_props_nb,
317 VkQueueFlagBits dev_family,
318 VkVideoCodecOperationFlagBitsKHR vid_ops)
320 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
321 if ((
s->hwctx->qf[
i].flags & dev_family) &&
322 (
s->hwctx->qf[
i].video_caps & vid_ops) == vid_ops) {
323 return &
s->hwctx->qf[
i];
339 VkSemaphoreWaitInfo sem_wait_info = {
340 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
342 .pSemaphores = &e->
sem,
345 vk->WaitSemaphores(
s->hwctx->act_dev, &sem_wait_info, UINT64_MAX);
346 vk->DestroySemaphore(
s->hwctx->act_dev, e->
sem,
s->hwctx->alloc);
358 vk->DestroyDescriptorPool(
s->hwctx->act_dev, sd->
desc_pool,
371 vk->DestroyCommandPool(
s->hwctx->act_dev, pool->
cmd_buf_pools[
i],
s->hwctx->alloc);
374 vk->DestroyQueryPool(
s->hwctx->act_dev, pool->
query_pool,
s->hwctx->alloc);
397 int nb_queries, VkQueryType query_type,
int query_64bit,
398 const void *query_create_pnext)
405 VkCommandBufferAllocateInfo cbuf_create;
407 const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *ef =
NULL;
411 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
413 VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR);
432 for (
int i = 0;
i < nb_contexts;
i++) {
435 .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
436 .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
437 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
438 .queueFamilyIndex = qf->
idx,
443 if (ret != VK_SUCCESS) {
451 cbuf_create = (VkCommandBufferAllocateInfo) {
452 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
453 .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
455 .commandBufferCount = 1,
457 ret = vk->AllocateCommandBuffers(
s->hwctx->act_dev, &cbuf_create,
459 if (ret != VK_SUCCESS) {
469 VkQueryPoolCreateInfo query_pool_info = {
470 .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
471 .pNext = query_create_pnext,
472 .queryType = query_type,
473 .queryCount = nb_queries*nb_contexts,
475 ret = vk->CreateQueryPool(
s->hwctx->act_dev, &query_pool_info,
477 if (ret != VK_SUCCESS) {
490 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
491 int nb_results =
av_popcount(ef->encodeFeedbackFlags);
494 }
else if (query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR) {
521#ifdef VK_KHR_internally_synchronized_queues
523 int internal_queue_sync = 0;
525 const VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *iqs;
527 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR);
528 internal_queue_sync = iqs && iqs->internallySynchronizedQueues;
538 int pin_queue = qf->
flags & (VK_QUEUE_VIDEO_DECODE_BIT_KHR |
539 VK_QUEUE_VIDEO_ENCODE_BIT_KHR);
544 VkSemaphoreTypeCreateInfo sem_type = {
545 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
546 .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
548 VkSemaphoreCreateInfo sem_create = {
549 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
554 ret = vk->CreateSemaphore(
s->hwctx->act_dev, &sem_create,
s->hwctx->alloc,
556 if (ret != VK_SUCCESS) {
573 e->
qi = pin_queue ? phase % qf->
num : (
i + phase) % qf->
num;
575 VkDeviceQueueInfo2 qinfo = {
576 .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,
577#ifdef VK_KHR_internally_synchronized_queues
578 .flags = internal_queue_sync ?
579 VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR : 0,
581 .queueFamilyIndex = qf->
idx,
584 vk->GetDeviceQueue2(
s->hwctx->act_dev, &qinfo, &e->
queue);
595 void **
data, VkQueryResultFlagBits
flags)
599 VkQueryResultFlags qf =
flags & ~(VK_QUERY_RESULT_64_BIT |
600 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR);
604 return VK_INCOMPLETE;
608 VK_QUERY_RESULT_64_BIT : 0x0;
610 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR : 0x0;
615 return vk->GetQueryPoolResults(
s->hwctx->act_dev, pool->
query_pool,
634 if (vk->GetSemaphoreCounterValue(
s->hwctx->act_dev, e->
sem, &sem_val) == VK_SUCCESS &&
648 VkSemaphoreWaitInfo sem_wait_info = {
649 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
651 .pSemaphores = &e->
sem,
655 vk->WaitSemaphores(
s->hwctx->act_dev, &sem_wait_info, UINT64_MAX);
666 VkCommandBufferBeginInfo cmd_start = {
667 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
668 .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
670 VkSemaphoreWaitInfo sem_wait_info = {
671 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
673 .pSemaphores = &e->
sem,
680 vk->WaitSemaphores(
s->hwctx->act_dev, &sem_wait_info, UINT64_MAX);
685 ret = vk->BeginCommandBuffer(e->
buf, &cmd_start);
686 if (ret != VK_SUCCESS) {
701 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
704 .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
727 case VK_OBJECT_TYPE_IMAGE_VIEW:
728 vk->DestroyImageView(
s->hwctx->act_dev,
729 (VkImageView)od->
obj,
s->hwctx->alloc);
731 case VK_OBJECT_TYPE_SEMAPHORE:
732 vk->DestroySemaphore(
s->hwctx->act_dev,
733 (VkSemaphore)od->
obj,
s->hwctx->alloc);
766 VkSemaphoreSignalInfo sig_info = {
767 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,
775 vk->ResetCommandBuffer(e->
buf, 0);
776 vk->SignalSemaphore(
s->hwctx->act_dev, &sig_info);
805 VkObjectType
type, uint64_t obj)
826 VkSemaphore sem, uint64_t
val,
827 VkPipelineStageFlagBits2 stage)
832 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
840 VkSemaphore sem, uint64_t
val,
841 VkPipelineStageFlagBits2 stage)
846 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
854 VkSemaphore *sem,
int nb,
855 VkPipelineStageFlagBits2 stage,
862 for (
int i = 0;
i < nb;
i++) {
864 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
874 for (
int i = 0;
i < nb;
i++) {
882 VkPipelineStageFlagBits2 wait_stage,
883 VkPipelineStageFlagBits2 signal_stage)
917 for (
int i = 0;
i < nb_images;
i++) {
919 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
920 .semaphore = vkf->
sem[
i],
922 .stageMask = wait_stage,
926 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
927 .semaphore = vkf->
sem[
i],
929 .stageMask = signal_stage,
940 VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
959 VkSemaphore *
dst, uint64_t *dst_val,
987 VkCommandBufferSubmitInfo cmd_buf_info = (VkCommandBufferSubmitInfo) {
988 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
989 .commandBuffer = e->
buf,
991 VkSubmitInfo2 submit_info = (VkSubmitInfo2) {
992 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
993 .pCommandBufferInfos = &cmd_buf_info,
994 .commandBufferInfoCount = 1,
997 .pSignalSemaphoreInfos = e->
sem_sig,
1001 ret = vk->EndCommandBuffer(e->
buf);
1002 if (ret != VK_SUCCESS) {
1009#if FF_API_VULKAN_SYNC_QUEUES
1011 s->hwctx->lock_queue(
s->device, e->
qf, e->
qi);
1014 ret = vk->QueueSubmit2(e->
queue, 1, &submit_info, VK_NULL_HANDLE);
1015#if FF_API_VULKAN_SYNC_QUEUES
1017 s->hwctx->unlock_queue(
s->device, e->
qf, e->
qi);
1021 if (ret != VK_SUCCESS) {
1042 for (
int i = 0;
i < nb_images;
i++) {
1059 VkMemoryPropertyFlagBits req_flags,
void *alloc_extension,
1060 VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
1066 VkMemoryAllocateInfo alloc_info = {
1067 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1068 .pNext = alloc_extension,
1071 alloc_info.allocationSize = req->size;
1075 for (
int i = 0;
i <
s->mprops.memoryTypeCount;
i++) {
1077 if (!(req->memoryTypeBits & (1 <<
i)))
1081 if ((req_flags != UINT32_MAX) &&
1082 ((
s->mprops.memoryTypes[
i].propertyFlags & req_flags) != req_flags))
1096 alloc_info.memoryTypeIndex =
index;
1098 ret = vk->AllocateMemory(
s->hwctx->act_dev, &alloc_info,
1099 s->hwctx->alloc, mem);
1100 if (ret != VK_SUCCESS)
1104 *mem_flags |=
s->mprops.memoryTypes[
index].propertyFlags;
1111 VkImageTiling tiling, VkImageUsageFlags
usage,
1112 VkImageCreateFlags
flags,
void *create_pnext)
1117 VkMemoryPropertyFlagBits mem_flags;
1119 VkImageCreateInfo create_info = {
1120 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1121 .pNext = create_pnext,
1123 .imageType = VK_IMAGE_TYPE_2D,
1127 .arrayLayers = nb_layers,
1129 .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
1131 .samples = VK_SAMPLE_COUNT_1_BIT,
1132 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1134 VkMemoryDedicatedAllocateInfo ded_alloc = {
1135 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1137 VkMemoryRequirements2 req = {
1138 .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
1140 VkImageMemoryRequirementsInfo2 req_desc = {
1141 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
1143 VkBindImageMemoryInfo bind_info = {
1144 .sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
1147 *
img = VK_NULL_HANDLE;
1148 *mem = VK_NULL_HANDLE;
1150 ret = vk->CreateImage(
s->hwctx->act_dev, &create_info,
1151 s->hwctx->alloc,
img);
1152 if (ret != VK_SUCCESS) {
1158 req_desc.image = *
img;
1159 vk->GetImageMemoryRequirements2(
s->hwctx->act_dev, &req_desc, &req);
1162 ded_alloc.image = *
img;
1164 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
1165 &ded_alloc, &mem_flags, mem);
1169 bind_info.image = *
img;
1170 bind_info.memory = *mem;
1171 ret = vk->BindImageMemory2(
s->hwctx->act_dev, 1, &bind_info);
1172 if (ret != VK_SUCCESS) {
1191 vk->DestroyImage(
s->hwctx->act_dev, *
img,
s->hwctx->alloc);
1192 *
img = VK_NULL_HANDLE;
1195 vk->FreeMemory(
s->hwctx->act_dev, *mem,
s->hwctx->alloc);
1196 *mem = VK_NULL_HANDLE;
1201 void *pNext,
void *alloc_pNext,
1202 VkBufferUsageFlags
usage, VkMemoryPropertyFlagBits
flags)
1209 VkBufferCreateInfo buf_spawn = {
1210 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1213 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1214 .size =
flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ?
1215 FFALIGN(
size,
s->props.properties.limits.minMemoryMapAlignment) :
1219 VkMemoryAllocateFlagsInfo alloc_flags = {
1220 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1221 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1223 VkBufferMemoryRequirementsInfo2 req_desc = {
1224 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
1226 VkMemoryDedicatedAllocateInfo ded_alloc = {
1227 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1228 .pNext = alloc_pNext,
1230 VkMemoryDedicatedRequirements ded_req = {
1231 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
1233 VkMemoryRequirements2 req = {
1234 .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
1239 "usage: 0x%x, flags: 0x%x\n",
1242 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &buf->
buf);
1243 if (ret != VK_SUCCESS) {
1249 req_desc.buffer = buf->
buf;
1251 vk->GetBufferMemoryRequirements2(
s->hwctx->act_dev, &req_desc, &req);
1254 use_ded_mem = ded_req.prefersDedicatedAllocation |
1255 ded_req.requiresDedicatedAllocation;
1257 ded_alloc.buffer = buf->
buf;
1258 ded_alloc.pNext = alloc_pNext;
1259 alloc_pNext = &ded_alloc;
1262 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1263 alloc_flags.pNext = alloc_pNext;
1264 alloc_pNext = &alloc_flags;
1272 ret = vk->BindBufferMemory(
s->hwctx->act_dev, buf->
buf, buf->
mem, 0);
1273 if (ret != VK_SUCCESS) {
1279 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1280 VkBufferDeviceAddressInfo address_info = {
1281 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1284 buf->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1293 int nb_buffers,
int invalidate)
1297 VkMappedMemoryRange inval_list[64];
1298 int inval_count = 0;
1300 for (
int i = 0;
i < nb_buffers;
i++) {
1302 ret = vk->MapMemory(
s->hwctx->act_dev, buf[
i]->
mem, 0,
1303 VK_WHOLE_SIZE, 0, &
dst);
1304 if (ret != VK_SUCCESS) {
1317 for (
int i = 0;
i < nb_buffers;
i++) {
1318 const VkMappedMemoryRange ival_buf = {
1319 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1320 .memory = buf[
i]->
mem,
1321 .size = VK_WHOLE_SIZE,
1323 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1325 inval_list[inval_count++] = ival_buf;
1329 ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, inval_count,
1331 if (ret != VK_SUCCESS) {
1342 VkDeviceSize
offset, VkDeviceSize mem_size,
1348 if (buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1351 const VkMappedMemoryRange flush_data = {
1352 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1359 ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, 1, &flush_data);
1361 ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, 1, &flush_data);
1363 if (ret != VK_SUCCESS) {
1378 VkMappedMemoryRange flush_list[64];
1379 int flush_count = 0;
1382 for (
int i = 0;
i < nb_buffers;
i++) {
1383 const VkMappedMemoryRange flush_buf = {
1384 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1385 .memory = buf[
i]->
mem,
1386 .size = VK_WHOLE_SIZE,
1390 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1392 flush_list[flush_count++] = flush_buf;
1397 ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, flush_count,
1399 if (ret != VK_SUCCESS) {
1406 for (
int i = 0;
i < nb_buffers;
i++) {
1407 vk->UnmapMemory(
s->hwctx->act_dev, buf[
i]->
mem);
1418 if (!buf || !
s->hwctx)
1423 if (buf->
buf != VK_NULL_HANDLE)
1424 vk->DestroyBuffer(
s->hwctx->act_dev, buf->
buf,
s->hwctx->alloc);
1425 if (buf->
mem != VK_NULL_HANDLE)
1426 vk->FreeMemory(
s->hwctx->act_dev, buf->
mem,
s->hwctx->alloc);
1430 buf->
buf = VK_NULL_HANDLE;
1431 buf->
mem = VK_NULL_HANDLE;
1442 void *create_pNext,
size_t size,
1443 VkMemoryPropertyFlagBits mem_props)
1474 if (mem_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
1488 VkExternalMemoryBufferCreateInfo *create_desc,
1489 VkImportMemoryHostPointerInfoEXT *import_desc,
1490 VkMemoryHostPointerPropertiesEXT props)
1496 VkBufferCreateInfo buf_spawn = {
1497 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1498 .pNext = create_desc,
1500 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1503 VkMemoryRequirements req = {
1505 .alignment =
s->hprops.minImportedHostPointerAlignment,
1506 .memoryTypeBits = props.memoryTypeBits,
1510 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1511 import_desc, &vkb->
flags, &vkb->
mem);
1515 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &vkb->
buf);
1516 if (ret != VK_SUCCESS) {
1517 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1521 ret = vk->BindBufferMemory(
s->hwctx->act_dev, vkb->
buf, vkb->
mem, 0);
1522 if (ret != VK_SUCCESS) {
1523 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1524 vk->DestroyBuffer(
s->hwctx->act_dev, vkb->
buf,
s->hwctx->alloc);
1537 uint8_t *src_data, VkDeviceSize
size,
1539 VkBufferUsageFlags
usage)
1545 VkExternalMemoryBufferCreateInfo create_desc = {
1546 .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1547 .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1549 VkMemoryAllocateFlagsInfo alloc_flags = {
1550 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1551 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1553 VkImportMemoryHostPointerInfoEXT import_desc = {
1554 .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
1555 .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1556 .pNext =
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT ? &alloc_flags :
NULL,
1558 VkMemoryHostPointerPropertiesEXT props;
1568 offs = (uintptr_t)src_data %
s->hprops.minImportedHostPointerAlignment;
1569 import_desc.pHostPointer = src_data - offs;
1571 props = (VkMemoryHostPointerPropertiesEXT) {
1572 VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT,
1574 ret = vk->GetMemoryHostPointerPropertiesEXT(
s->hwctx->act_dev,
1575 import_desc.handleType,
1576 import_desc.pHostPointer,
1578 if (!(ret == VK_SUCCESS && props.memoryTypeBits))
1587 const VkDeviceSize src_avail = src_buf->
size - (src_data - src_buf->
data);
1588 buffer_size = offs +
FFMIN(
size, src_avail);
1589 buffer_size =
FFALIGN(buffer_size,
s->props.properties.limits.minMemoryMapAlignment);
1590 buffer_size =
FFALIGN(buffer_size,
s->hprops.minImportedHostPointerAlignment);
1600 buffer_size, &create_desc, &import_desc,
1608 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1609 VkBufferDeviceAddressInfo address_info = {
1610 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1613 vkb->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1620 vkb->
size = buffer_size - offs;
1628 VkShaderStageFlagBits stage)
1632 pc->stageFlags = stage;
1639 int unnorm_coords, VkFilter
filt)
1644 VkSamplerCreateInfo sampler_info = {
1645 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1647 .minFilter = sampler_info.magFilter,
1648 .mipmapMode = (unnorm_coords ||
filt == VK_FILTER_NEAREST) ?
1649 VK_SAMPLER_MIPMAP_MODE_NEAREST :
1650 VK_SAMPLER_MIPMAP_MODE_LINEAR,
1651 .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
1652 .addressModeV = sampler_info.addressModeU,
1653 .addressModeW = sampler_info.addressModeU,
1654 .anisotropyEnable = VK_FALSE,
1655 .compareOp = VK_COMPARE_OP_NEVER,
1656 .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
1657 .unnormalizedCoordinates = unnorm_coords,
1660 ret = vk->CreateSampler(
s->hwctx->act_dev, &sampler_info,
1661 s->hwctx->alloc, sampler);
1662 if (ret != VK_SUCCESS) {
1678 static const VkImageAspectFlags plane_aspect[] = { VK_IMAGE_ASPECT_PLANE_0_BIT,
1679 VK_IMAGE_ASPECT_PLANE_1_BIT,
1680 VK_IMAGE_ASPECT_PLANE_2_BIT, };
1683 return VK_IMAGE_ASPECT_COLOR_BIT;
1685 return plane_aspect[p];
1757 int lut_tmp[4] = { lut[0], lut[1], lut[2], lut[3] };
1758 for (
int i = 0;
i < 4;
i++)
1759 lut[lut_tmp[
i]] =
i;
1780 const char *rep_tab[] = {
1786 return rep_tab[rep_fmt];
1792 const char *rep_tab[] = {
1798 return rep_tab[rep_fmt];
1806 const char *rep_tab[] = {
1812 return rep_tab[rep_fmt];
1815 const char *rep_tab[] = {
1821 return rep_tab[rep_fmt];
1825 const char *rep_tab[] = {
1831 return rep_tab[rep_fmt];
1835 const char *rep_tab[] = {
1841 return rep_tab[rep_fmt];
1852 const char *rep_tab[] = {
1858 return rep_tab[rep_fmt];
1892 const char *rep_tab[] = {
1898 return rep_tab[rep_fmt];
1904 const char *rep_tab[] = {
1910 return rep_tab[rep_fmt];
1913 const char *rep_tab[] = {
1919 return rep_tab[rep_fmt];
1924 const char *rep_tab[] = {
1930 return rep_tab[rep_fmt];
1935 const char *rep_tab[] = {
1941 return rep_tab[rep_fmt];
1949 const char *rep_tab[] = {
1955 return rep_tab[rep_fmt];
1986 iv->
dev =
s->hwctx->act_dev;
1987 iv->
alloc =
s->hwctx->alloc;
1995#define REPS_FMT(fmt) \
1996 [FF_VK_REP_NATIVE] = fmt ## _UINT, \
1997 [FF_VK_REP_FLOAT] = fmt ## _UNORM, \
1998 [FF_VK_REP_INT] = fmt ## _SINT, \
1999 [FF_VK_REP_UINT] = fmt ## _UINT,
2001#define REPS_FMT_PACK(fmt, num) \
2002 [FF_VK_REP_NATIVE] = fmt ## _UINT_PACK ## num, \
2003 [FF_VK_REP_FLOAT] = fmt ## _UNORM_PACK ## num, \
2004 [FF_VK_REP_INT] = fmt ## _SINT_PACK ## num, \
2005 [FF_VK_REP_UINT] = fmt ## _UINT_PACK ## num,
2011 VK_FORMAT_B5G6R5_UNORM_PACK16,
2012 VK_FORMAT_B5G6R5_UNORM_PACK16,
2013 VK_FORMAT_UNDEFINED,
2014 VK_FORMAT_UNDEFINED,
2017 VK_FORMAT_R5G6B5_UNORM_PACK16,
2018 VK_FORMAT_R5G6B5_UNORM_PACK16,
2019 VK_FORMAT_UNDEFINED,
2020 VK_FORMAT_UNDEFINED,
2031 {
REPS_FMT(VK_FORMAT_R16G16B16A16) },
2034 VK_FORMAT_R32_SFLOAT,
2039 VK_FORMAT_R32G32B32_SFLOAT,
2040 VK_FORMAT_R32G32B32_SFLOAT,
2041 VK_FORMAT_UNDEFINED,
2042 VK_FORMAT_UNDEFINED,
2045 VK_FORMAT_R16G16B16A16_SFLOAT,
2046 VK_FORMAT_R16G16B16A16_SFLOAT,
2047 VK_FORMAT_UNDEFINED,
2048 VK_FORMAT_UNDEFINED,
2051 VK_FORMAT_R32G32B32A32_SFLOAT,
2052 VK_FORMAT_R32G32B32A32_SFLOAT,
2053 VK_FORMAT_UNDEFINED,
2054 VK_FORMAT_UNDEFINED,
2057 VK_FORMAT_R32G32B32_UINT,
2058 VK_FORMAT_UNDEFINED,
2059 VK_FORMAT_R32G32B32_SINT,
2060 VK_FORMAT_R32G32B32_UINT,
2063 VK_FORMAT_R32G32B32A32_UINT,
2064 VK_FORMAT_UNDEFINED,
2065 VK_FORMAT_R32G32B32A32_SINT,
2066 VK_FORMAT_R32G32B32A32_UINT,
2069 VK_FORMAT_R16_SFLOAT,
2070 VK_FORMAT_R16_SFLOAT,
2078 if (fmt == VK_FORMAT_UNDEFINED)
2079 return VK_FORMAT_UNDEFINED;
2086 return fmts_map[
i][rep_fmt];
2089 return VK_FORMAT_UNDEFINED;
2093 VkImageView *img_view, VkImageAspectFlags *aspect,
2104 VkImageViewUsageCreateInfo view_usage_info = {
2105 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
2106 .usage = vkfc->
usage &
2107 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
2108 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
2110 VkImageViewCreateInfo view_create_info = {
2111 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
2112 .pNext = &view_usage_info,
2113 .image = vkf->
img[
FFMIN(plane, nb_images - 1)],
2114 .viewType = VK_IMAGE_VIEW_TYPE_2D,
2117 .subresourceRange = {
2123 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
2125 "of format %i and mode %i\n",
2126 rep_fmts[plane], rep_fmt);
2130 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
2131 s->hwctx->alloc, img_view);
2132 if (ret != VK_SUCCESS) {
2138 *aspect = view_create_info.subresourceRange.aspectMask;
2158 for (
int i = 0;
i < nb_planes;
i++) {
2159 VkImageViewUsageCreateInfo view_usage_info = {
2160 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
2161 .usage = vkfc->
usage &
2162 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
2163 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
2165 VkImageViewCreateInfo view_create_info = {
2166 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
2167 .pNext = &view_usage_info,
2168 .image = vkf->
img[
FFMIN(
i, nb_images - 1)],
2169 .viewType = VK_IMAGE_VIEW_TYPE_2D,
2172 .subresourceRange = {
2178 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
2180 "of format %i and mode %i\n",
2181 rep_fmts[
i], rep_fmt);
2186 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
2187 s->hwctx->alloc, &tmp_views[
i]);
2188 if (ret != VK_SUCCESS) {
2197 for (
int i = 0;
i < nb_planes;
i++)
2199 (uint64_t)tmp_views[
i]);
2201 memcpy(views, tmp_views, nb_planes*
sizeof(*views));
2206 for (
int i = 0;
i < nb_planes;
i++)
2208 vk->DestroyImageView(
s->hwctx->act_dev, tmp_views[
i],
s->hwctx->alloc);
2213 AVFrame *pic, VkImageMemoryBarrier2 *bar,
int *nb_bar,
2214 VkPipelineStageFlags2 src_stage,
2215 VkPipelineStageFlags2 dst_stage,
2216 VkAccessFlagBits2 new_access,
2217 VkImageLayout new_layout,
2230 for (
int i = 0;
i < nb_images;
i++) {
2231 bar[*nb_bar] = (VkImageMemoryBarrier2) {
2232 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
2234 .srcStageMask = src_stage,
2235 .dstStageMask = dst_stage,
2237 .dstAccessMask = new_access,
2239 .newLayout = new_layout,
2241 .dstQueueFamilyIndex = new_qf,
2242 .image = vkf->
img[
i],
2243 .subresourceRange = (VkImageSubresourceRange) {
2244 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
2256 VkPipelineStageFlags stage, VkSpecializationInfo *spec,
2257 uint32_t wg_size[3], uint32_t required_subgroup_size)
2262 memcpy(shd->
lg_size, wg_size, 3*
sizeof(uint32_t));
2264 shd->
subgroup_info = (VkPipelineShaderStageRequiredSubgroupSizeCreateInfo) {
2265 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO,
2266 .requiredSubgroupSize = required_subgroup_size,
2269 switch (shd->
stage) {
2270 case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
2271 case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
2272 case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
2273 case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
2274 case VK_SHADER_STAGE_MISS_BIT_KHR:
2275 case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
2276 shd->
bind_point = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR;
2278 case VK_SHADER_STAGE_COMPUTE_BIT:
2279 shd->
bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
2282 shd->
bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
2293 VkPipelineLayoutCreateInfo pipeline_layout_info;
2296 pipeline_layout_info = (VkPipelineLayoutCreateInfo) {
2297 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2304 ret = vk->CreatePipelineLayout(
s->hwctx->act_dev, &pipeline_layout_info,
2306 if (ret != VK_SUCCESS) {
2316 VkShaderModule *
mod,
2317 const uint8_t *spirv,
size_t spirv_len)
2322 VkShaderModuleCreateInfo shader_module_info = {
2323 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2326 .pCode = (
void *)spirv,
2327 .codeSize = spirv_len,
2330 ret = vk->CreateShaderModule(
s->hwctx->act_dev, &shader_module_info,
2331 s->hwctx->alloc,
mod);
2332 if (ret != VK_SUCCESS) {
2342 VkShaderModule
mod,
const char *entrypoint)
2347 VkComputePipelineCreateInfo pipeline_create_info = {
2348 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2351 .stage = (VkPipelineShaderStageCreateInfo) {
2352 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2355 .pName = entrypoint,
2357 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT : 0x0,
2358 .stage = shd->
stage,
2364 ret = vk->CreateComputePipelines(
s->hwctx->act_dev, VK_NULL_HANDLE, 1,
2365 &pipeline_create_info,
2367 if (ret != VK_SUCCESS) {
2377 const uint8_t *spirv,
size_t spirv_len,
2378 size_t *binary_size,
const char *entrypoint)
2383 VkShaderCreateInfoEXT shader_obj_create = {
2384 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
2388 VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT : 0x0,
2389 .stage = shd->
stage,
2391 .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
2393 .codeSize = spirv_len,
2394 .pName = entrypoint,
2402 ret = vk->CreateShadersEXT(
s->hwctx->act_dev, 1, &shader_obj_create,
2403 s->hwctx->alloc, &shd->
object);
2404 if (ret != VK_SUCCESS) {
2410 if (vk->GetShaderBinaryDataEXT(
s->hwctx->act_dev, shd->
object,
2411 binary_size,
NULL) != VK_SUCCESS)
2422 int has_singular = 0;
2423 int max_descriptors = 0;
2430 (max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
2432 (has_singular == 0);
2436 VkDescriptorSetLayoutCreateInfo desc_layout_create = {
2437 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2438 .bindingCount =
set->nb_bindings,
2439 .pBindings =
set->binding,
2441 VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR :
2445 ret = vk->CreateDescriptorSetLayout(
s->hwctx->act_dev,
2446 &desc_layout_create,
2449 if (ret != VK_SUCCESS) {
2460 const char *spirv,
size_t spirv_len,
2461 const char *entrypoint)
2465 VkSpecializationMapEntry spec_entries[3];
2466 VkSpecializationInfo spec_info;
2467 size_t input_size = spirv_len, binary_size = 0;
2471 spec_info = (VkSpecializationInfo) {
2472 .pMapEntries = spec_entries,
2481 for (
int i = 0;
i < 3;
i++) {
2483 .constantID = 253 +
i,
2485 .
size =
sizeof(uint32_t),
2491 shd->
lg_size, 3*
sizeof(uint32_t));
2494#if CONFIG_SHADER_COMPRESSION
2501 spirv_len = out_len;
2515 &binary_size, entrypoint);
2525 case VK_PIPELINE_BIND_POINT_COMPUTE:
2536 vk->DestroyShaderModule(
s->hwctx->act_dev,
mod,
s->hwctx->alloc);
2546 if (input_size != spirv_len)
2549 if (binary_size != spirv_len)
2558#if CONFIG_SHADER_COMPRESSION
2573 for (
int i = 0;
i < nb;
i++) {
2574 set->binding[
i].binding =
i;
2575 set->binding[
i].descriptorType =
desc[
i].type;
2577 set->binding[
i].stageFlags =
desc[
i].stages;
2578 set->binding[
i].pImmutableSamplers =
desc[
i].samplers;
2581 for (
int i = 0;
i < nb;
i++) {
2595 set->singular = singular;
2596 set->nb_bindings = nb;
2614 VkDescriptorSetLayout *tmp_layouts;
2615 VkDescriptorSetAllocateInfo set_alloc_info;
2616 VkDescriptorPoolCreateInfo pool_create_info;
2621 pool_create_info = (VkDescriptorPoolCreateInfo) {
2622 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2629 ret = vk->CreateDescriptorPool(
s->hwctx->act_dev, &pool_create_info,
2631 if (ret != VK_SUCCESS) {
2637 tmp_layouts =
av_malloc_array(pool_create_info.maxSets,
sizeof(*tmp_layouts));
2646 set_alloc_info = (VkDescriptorSetAllocateInfo) {
2647 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2649 .pSetLayouts = tmp_layouts,
2650 .descriptorSetCount = pool_create_info.maxSets,
2654 sizeof(*tmp_layouts));
2659 ret = vk->AllocateDescriptorSets(
s->hwctx->act_dev, &set_alloc_info,
2662 if (ret != VK_SUCCESS) {
2684 VkWriteDescriptorSet *write_info)
2693 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2697 vk->CmdPushDescriptorSetKHR(e->
buf,
2704 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2711 VkImageView view, VkImageLayout
layout,
2716 VkDescriptorImageInfo desc_pool_write_info_img = {
2721 VkWriteDescriptorSet desc_pool_write_info = {
2722 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2724 .descriptorCount = 1,
2725 .dstArrayElement = offs,
2726 .descriptorType = desc_set->
binding[bind].descriptorType,
2727 .pImageInfo = &desc_pool_write_info_img,
2736 VkImageView *views,
int set,
int binding,
2737 VkImageLayout
layout, VkSampler sampler)
2742 for (
int i = 0;
i < nb_planes;
i++)
2749 int set,
int bind,
int elem,
2755 VkDescriptorBufferInfo desc_pool_write_info_buf = {
2760 VkWriteDescriptorSet desc_pool_write_info = {
2761 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2763 .descriptorCount = 1,
2764 .dstArrayElement = elem,
2765 .descriptorType = desc_set->
binding[bind].descriptorType,
2766 .pBufferInfo = &desc_pool_write_info_buf,
2775 VkShaderStageFlagBits stage,
2790 VkShaderStageFlagBits stages = shd->
stage;
2791 vk->CmdBindShadersEXT(e->
buf, 1, &stages, &shd->
object);
2811 if (shd->shader.module)
2812 vk->DestroyShaderModule(
s->hwctx->act_dev, shd->shader.module,
2817 vk->DestroyShaderEXT(
s->hwctx->act_dev, shd->
object,
s->hwctx->alloc);
2819 vk->DestroyPipeline(
s->hwctx->act_dev, shd->
pipeline,
s->hwctx->alloc);
2826 vk->DestroyDescriptorSetLayout(
s->hwctx->act_dev, shd->
desc_layout[
i],
2835#ifdef VK_KHR_maintenance9
2851 static const AVClass vulkan_context_class = {
2857 memset(
s, 0,
sizeof(*
s));
2858 s->log_parent = log_parent;
2859 s->class = &vulkan_context_class;
2867 s->hwfc =
s->frames->hwctx;
2869 device_ref =
s->frames->device_ref;
2873 if (!
s->device_ref) {
2879 s->hwctx =
s->device->hwctx;
2882 s->hwctx->nb_enabled_dev_extensions);
2884 s->hwctx->nb_enabled_inst_extensions);
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
static double val(void *priv, double ch)
static const char *const format[]
static cqueue * cqueue_create(int size, int max_size)
static const int8_t filt[NUMTAPS *2]
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
static void BS_FUNC skip(BSCTX *bc, unsigned int n)
Skip n bits in the buffer.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static enum AVPixelFormat pix_fmt
void(* flush)(AVBSFContext *ctx)
#define atomic_store_explicit(object, desired, order)
#define atomic_init(obj, value)
#define AV_NUM_DATA_POINTERS
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
AVBufferRef * av_buffer_ref(const AVBufferRef *buf)
Create a new reference to an AVBuffer.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
#define AVERROR_EXTERNAL
Generic error in an external library.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define LIBAVUTIL_VERSION_INT
const VkFormat * av_vkfmt_from_pixfmt(enum AVPixelFormat p)
Returns the optimal per-plane Vulkan format for a given sw_format, one for each plane.
#define FF_DISABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
static int ff_thread_once(char *control, void(*routine)(void))
void ff_vk_set_perm(enum AVPixelFormat pix_fmt, int lut[4], int inv)
Since storage images may not be swizzled, we have to do this in the shader itself.
static int init_pipeline_layout(FFVulkanContext *s, FFVulkanShader *shd)
void ff_vk_shader_update_img_array(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, AVFrame *f, VkImageView *views, int set, int binding, VkImageLayout layout, VkSampler sampler)
Update a descriptor in a buffer with an image array.
#define REPS_FMT_PACK(fmt, num)
int ff_vk_shader_load(FFVulkanShader *shd, VkPipelineStageFlags stage, VkSpecializationInfo *spec, uint32_t wg_size[3], uint32_t required_subgroup_size)
Initialize a shader object.
void ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd, const FFVulkanDescriptorSetBinding *desc, int nb, int singular)
Add descriptor to a shader.
void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
const char * ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt, enum FFVkShaderRepFormat rep_fmt)
int ff_vk_unmap_buffers(FFVulkanContext *s, FFVkBuffer **buf, int nb_buffers, int flush)
VkImageAspectFlags ff_vk_aspect_flag(AVFrame *f, int p)
Get the aspect flag for a plane from an image.
int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size, void *pNext, void *alloc_pNext, VkBufferUsageFlags usage, VkMemoryPropertyFlagBits flags)
static void exec_pool_phase_seed(void)
int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext)
Allocates/frees an execution pool.
static const FFVulkanShaderData * get_shd_data(FFVkExecContext *e, const FFVulkanShader *shd)
void ff_vk_image_free(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem)
Free an image created by ff_vk_image_create(); all GPU use must have completed.
void ff_vk_exec_wait(FFVulkanContext *s, FFVkExecContext *e)
static int init_compute_pipeline(FFVulkanContext *s, FFVulkanShader *shd, VkShaderModule mod, const char *entrypoint)
int ff_vk_alloc_mem(FFVulkanContext *s, VkMemoryRequirements *req, VkMemoryPropertyFlagBits req_flags, void *alloc_extension, VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
int ff_vk_image_create(FFVulkanContext *s, VkImage *img, VkDeviceMemory *mem, int width, int height, VkFormat format, int nb_layers, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, void *create_pnext)
Memory/buffer/image allocation helpers.
int ff_vk_shader_add_push_const(FFVulkanShader *shd, int offset, int size, VkShaderStageFlagBits stage)
Add/update push constants for execution.
int ff_vk_shader_update_img(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int offs, VkImageView view, VkImageLayout layout, VkSampler sampler)
Sets an image descriptor for specified shader and binding.
void ff_vk_uninit(FFVulkanContext *s)
Frees main context.
int ff_vk_load_props(FFVulkanContext *s)
Loads props/mprops/driver_props.
int ff_vk_map_buffers(FFVulkanContext *s, FFVkBuffer **buf, uint8_t *mem[], int nb_buffers, int invalidate)
Buffer management code.
const char * ff_vk_ret2str(VkResult res)
Converts Vulkan return values to strings.
static void host_map_free(AVRefStructOpaque opaque, void *obj)
int ff_vk_init(FFVulkanContext *s, void *log_parent, AVBufferRef *device_ref, AVBufferRef *frames_ref)
Initializes the AVClass, in case this context is not used as the main user's context.
int ff_vk_exec_add_dep_sw_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f)
void ff_vk_exec_add_dep_obj(FFVulkanContext *s, FFVkExecContext *e, VkObjectType type, uint64_t obj)
static void pooled_buf_free(AVRefStructOpaque opaque, void *obj)
void ff_vk_free_buf(FFVulkanContext *s, FFVkBuffer *buf)
const VkComponentMapping ff_comp_identity_map
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e, AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar, VkPipelineStageFlags2 src_stage, VkPipelineStageFlags2 dst_stage, VkAccessFlagBits2 new_access, VkImageLayout new_layout, uint32_t new_qf)
int ff_vk_exec_start(FFVulkanContext *s, FFVkExecContext *e)
Start/submit/wait an execution.
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, VkImageView views[AV_NUM_DATA_POINTERS], AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
Create an imageview and add it as a dependency to an execution.
static int create_shader_module(FFVulkanContext *s, FFVulkanShader *shd, VkShaderModule *mod, const uint8_t *spirv, size_t spirv_len)
static int create_mapped_buffer(FFVulkanContext *s, FFVkBuffer *vkb, VkBufferUsageFlags usage, size_t size, VkExternalMemoryBufferCreateInfo *create_desc, VkImportMemoryHostPointerInfoEXT *import_desc, VkMemoryHostPointerPropertiesEXT props)
static AVOnce exec_pool_phase_seeded
void ff_vk_shader_free(FFVulkanContext *s, FFVulkanShader *shd)
Free a shader.
FFVkImageViews * ff_vk_imageviews_alloc(FFVulkanContext *s, int nb_views)
Allocate a reference-counted set of image views, zero-initialized for the caller to create.
VkResult ff_vk_exec_get_query(FFVulkanContext *s, FFVkExecContext *e, void **data, VkQueryResultFlagBits flags)
Performs nb_queries queries and returns their results and statuses.
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool, FFVulkanShader *shd)
Register a shader with an exec pool.
int ff_vk_init_sampler(FFVulkanContext *s, VkSampler *sampler, int unnorm_coords, VkFilter filt)
Create a sampler.
void ff_vk_exec_update_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
FFVkExecContext * ff_vk_exec_get(FFVulkanContext *s, FFVkExecPool *pool)
Retrieve an execution pool.
int ff_vk_mt_is_np_rgb(enum AVPixelFormat pix_fmt)
Returns 1 if pixfmt is a usable RGB format.
static void reset_imageviews(AVRefStructOpaque unused, void *obj)
static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd)
static void update_set_pool_write(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, VkWriteDescriptorSet *write_info)
int ff_vk_exec_submit(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e, const FFVulkanShader *shd)
Bind a shader.
void ff_vk_exec_move_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, int set, int bind, int elem, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize len, VkFormat fmt)
Update a descriptor in a buffer with a buffer.
static int create_shader_object(FFVulkanContext *s, FFVulkanShader *shd, const uint8_t *spirv, size_t spirv_len, size_t *binary_size, const char *entrypoint)
#define FN_MAP_TO(dst_t, dst_name, src_t, src_name)
AVVulkanDeviceQueueFamily * ff_vk_qf_find(FFVulkanContext *s, VkQueueFlagBits dev_family, VkVideoCodecOperationFlagBitsKHR vid_ops)
Chooses an appropriate QF.
int ff_vk_host_map_buffer(FFVulkanContext *s, FFVkBuffer **dst, uint8_t *src_data, VkDeviceSize size, const AVBufferRef *src_buf, VkBufferUsageFlags usage)
Maps a system RAM buffer into a Vulkan buffer.
void ff_vk_exec_add_dep_refstruct(FFVulkanContext *s, FFVkExecContext *e, void *obj)
Execution dependency management.
int ff_vk_create_imageview(FFVulkanContext *s, VkImageView *img_view, VkImageAspectFlags *aspect, AVFrame *f, int plane, enum FFVkShaderRepFormat rep_fmt)
Create a single imageview for a given plane.
int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVRefStructPool **buf_pool, FFVkBuffer **buf, VkBufferUsageFlags usage, void *create_pNext, size_t size, VkMemoryPropertyFlagBits mem_props)
Initialize a pool and create AVBufferRefs containing FFVkBuffer.
static void load_enabled_qfs(FFVulkanContext *s)
static VkFormat map_fmt_to_rep(VkFormat fmt, enum FFVkShaderRepFormat rep_fmt)
int ff_vk_flush_buffer(FFVulkanContext *s, FFVkBuffer *buf, VkDeviceSize offset, VkDeviceSize mem_size, int flush)
Flush or invalidate a single buffer, with a given size and offset.
static atomic_uint exec_pool_phase[FF_ARRAY_ELEMS(((AVVulkanDeviceContext *) NULL) ->qf)]
int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *dst, uint64_t *dst_val, AVFrame *f)
static void exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_add_dep_signal_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore sem, uint64_t val, VkPipelineStageFlagBits2 stage)
void ff_vk_exec_discard(FFVulkanContext *s, FFVkExecContext *e)
void ff_vk_exec_add_dep_bool_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore *sem, int nb, VkPipelineStageFlagBits2 stage, int wait)
int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd, const char *spirv, size_t spirv_len, const char *entrypoint)
Link a shader into an executable.
int ff_vk_exec_add_dep_frame(FFVulkanContext *s, FFVkExecContext *e, AVFrame *f, VkPipelineStageFlagBits2 wait_stage, VkPipelineStageFlagBits2 signal_stage)
void ff_vk_shader_update_push_const(FFVulkanContext *s, FFVkExecContext *e, FFVulkanShader *shd, VkShaderStageFlagBits stage, int offset, size_t size, void *src)
Update push constant in a shader.
void ff_vk_exec_add_dep_wait_sem(FFVulkanContext *s, FFVkExecContext *e, VkSemaphore sem, uint64_t val, VkPipelineStageFlagBits2 stage)
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex)
static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
static av_always_inline int pthread_mutex_trylock(pthread_mutex_t *mutex)
static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_RGBF32
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_RGBAF32
#define AV_PIX_FMT_RGBAF16
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_GBRAP32
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GRAY32
#define AV_PIX_FMT_RGBA128
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GBRAPF16
#define AV_PIX_FMT_RGBA64
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_BAYER_RGGB16
#define AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_X2RGB10
#define AV_PIX_FMT_GRAYF32
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_UYVA
packed UYVA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), UYVAUYVA...
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_RGB24
packed RGB 8:8:8, 24bpp, RGBRGB...
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_BGR0
packed BGR 8:8:8, 32bpp, BGRXBGRX... X=unused/undefined
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_BGRA
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_UYVY422
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
@ AV_PIX_FMT_ABGR
packed ABGR 8:8:8:8, 32bpp, ABGRABGR...
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_NV24
planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_0BGR
packed BGR 8:8:8, 32bpp, XBGRXBGR... X=unused/undefined
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_RGBA
packed RGBA 8:8:8:8, 32bpp, RGBARGBA...
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_RGB0
packed RGB 8:8:8, 32bpp, RGBXRGBX... X=unused/undefined
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_X2BGR10
#define AV_PIX_FMT_BGR565
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_RGB565
#define AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GBRPF16
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
static void av_refstruct_pool_uninit(AVRefStructPool **poolp)
Mark the pool as being available for freeing.
static void * av_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(AVRefStructOpaque opaque, void *obj))
A wrapper around av_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
static AVRefStructPool * av_refstruct_pool_alloc_ext(size_t size, unsigned flags, void *opaque, int(*init_cb)(AVRefStructOpaque opaque, void *obj), void(*reset_cb)(AVRefStructOpaque opaque, void *obj), void(*free_entry_cb)(AVRefStructOpaque opaque, void *obj), void(*free_cb)(AVRefStructOpaque opaque))
A wrapper around av_refstruct_pool_alloc_ext_c() for the common case of a non-const qualified opaque.
#define FF_ARRAY_ELEMS(a)
A reference to a data buffer.
uint8_t * data
The data buffer.
size_t size
Size of data in bytes.
Describe the class of an AVClass context structure.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
This struct describes a set or pool of "hardware" frames (i.e.
void * hwctx
The format-specific data, allocated and freed automatically along with this context.
enum AVPixelFormat sw_format
The pixel format identifying the actual data layout of the hardware frames.
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
VkImageLayout layout[AV_NUM_DATA_POINTERS]
VkSemaphore sem[AV_NUM_DATA_POINTERS]
Synchronization timeline semaphores, one for each VkImage.
uint32_t queue_family[AV_NUM_DATA_POINTERS]
Queue family of the images.
VkAccessFlagBits2 access[AV_NUM_DATA_POINTERS]
Updated after every barrier.
uint64_t sem_value[AV_NUM_DATA_POINTERS]
Up to date semaphore value at which each image becomes accessible.
VkImage img[AV_NUM_DATA_POINTERS]
Vulkan images to which the memory is bound to.
Main Vulkan context, allocated as AVHWDeviceContext.hwctx.
Allocated as AVHWFramesContext.hwctx, used to set pool-specific options.
VkImageUsageFlagBits usage
Defines extra usage of output frames.
void(* lock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf)
Locks a frame, preventing other threads from changing frame properties.
void(* unlock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf)
Similar to lock_frame(), unlocks a frame.
VkMemoryPropertyFlagBits flags
VkAccessFlagBits access_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
AVBufferRef * buf_deps[FF_VK_EXEC_MAX_BUF_DEPS]
uint8_t frame_update[FF_VK_EXEC_MAX_FRAME_DEPS]
VkSemaphoreSubmitInfo sem_wait[FF_VK_EXEC_MAX_SEM_OPS]
FFVkExecObjDep obj_deps[FF_VK_EXEC_MAX_BUF_DEPS]
AVFrame * sw_frame_deps[FF_VK_EXEC_MAX_SW_FRAME_DEPS]
uint32_t queue_family_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
uint64_t * sem_sig_val_dst[FF_VK_EXEC_MAX_SEM_OPS]
VkSemaphoreSubmitInfo sem_sig[FF_VK_EXEC_MAX_SEM_OPS]
const struct FFVkExecPool * parent
uint8_t frame_locked[FF_VK_EXEC_MAX_FRAME_DEPS]
void * refstruct_deps[FF_VK_EXEC_MAX_BUF_DEPS]
VkImageLayout layout_dst[FF_VK_EXEC_MAX_FRAME_DEPS]
AVFrame * frame_deps[FF_VK_EXEC_MAX_FRAME_DEPS]
FFVulkanShaderData reg_shd[FF_VK_MAX_SHADERS]
atomic_uint_least64_t idx
FFVkExecContext * contexts
VkCommandBuffer * cmd_bufs
VkCommandPool * cmd_buf_pools
PFN_vkDestroyImageView destroy_image_view
const VkAllocationCallbacks * alloc
VkImageView views[AV_NUM_DATA_POINTERS]
VkDescriptorSetLayoutBinding binding[FF_VK_MAX_DESCRIPTOR_BINDINGS]
VkDescriptorSet * desc_sets
VkDescriptorPool desc_pool
VkPipelineLayout pipeline_layout
FFVulkanDescriptorSet desc_set[FF_VK_MAX_DESCRIPTOR_SETS]
VkPipelineShaderStageRequiredSubgroupSizeCreateInfo subgroup_info
VkPipelineStageFlags stage
VkSpecializationInfo * specialization_info
VkPushConstantRange push_consts[FF_VK_MAX_PUSH_CONSTS]
VkDescriptorSetLayout desc_layout[FF_VK_MAX_DESCRIPTOR_SETS]
VkPipelineBindPoint bind_point
VkDescriptorPoolSize desc_pool_size[FF_VK_MAX_DESCRIPTOR_TYPES]
#define av_malloc_array(a, b)
static int ref[MAX_W *MAX_W]
static void set(uint8_t *a[], int ch, int index, int ch_count, enum AVSampleFormat f, double v)
RefStruct is an API for creating reference-counted objects with minimal overhead.
static int mod(int a, int b)
Modulo operation with only positive remainders.
FFVkShaderRepFormat
Returns the format to use for images in shaders.
#define FF_VK_STRUCT_EXT(CTX, BASE, STRUCT_P, EXT_FLAG, TYPE)
#define FF_VK_EXEC_MAX_SEM_OPS
static const void * ff_vk_find_struct(const void *chain, VkStructureType stype)
#define FF_VK_MAX_SHADERS
static int ff_vk_unmap_buffer(FFVulkanContext *s, FFVkBuffer *buf, int flush)
#define FF_VK_EXEC_MAX_FRAME_DEPS
static int ff_vk_count_images(AVVkFrame *f)
#define FF_VK_MAX_PUSH_CONSTS
#define FF_VK_MAX_DESCRIPTOR_BINDINGS
#define FF_VK_EXEC_MAX_BUF_DEPS
#define FF_VK_EXEC_MAX_SW_FRAME_DEPS
#define FF_VK_MAX_DESCRIPTOR_SETS
static int ff_vk_map_buffer(FFVulkanContext *s, FFVkBuffer *buf, uint8_t **mem, int invalidate)
#define FF_VK_MAX_DESCRIPTOR_TYPES
#define FF_VK_EXT_SHADER_OBJECT
#define FF_VK_EXT_VIDEO_QUEUE
#define FF_VK_EXT_UNIFIED_IMAGE_LAYOUTS
#define FF_VK_EXT_COOP_MATRIX
#define FF_VK_EXT_INTERNAL_QUEUE_SYNC
#define FF_VK_EXT_NO_FLAG
#define FF_VK_EXT_OPTICAL_FLOW
#define FF_VK_EXT_PUSH_DESCRIPTOR
#define FF_VK_EXT_LONG_VECTOR
#define FF_VK_EXT_MAINTENANCE_9
#define FF_VK_EXT_HOST_IMAGE_COPY
#define FF_VK_EXT_ATOMIC_FLOAT
#define FF_VK_EXT_EXTERNAL_HOST_MEMORY
static uint64_t ff_vk_extensions_to_mask(const char *const *extensions, int nb_extensions)
static int ff_vk_load_functions(AVHWDeviceContext *ctx, FFVulkanFunctions *vk, uint64_t extensions_mask, int has_inst, int has_dev)
Function loader.
#define atomic_fetch_add(object, operand)
static int ff_zlib_expand(void *ctx, uint8_t **out, size_t *out_len, const uint8_t *src, int src_len)