28 #if CONFIG_SHADER_COMPRESSION
33 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
34 .g = VK_COMPONENT_SWIZZLE_IDENTITY,
35 .b = VK_COMPONENT_SWIZZLE_IDENTITY,
36 .a = VK_COMPONENT_SWIZZLE_IDENTITY,
42 #define CASE(VAL) case VAL: return #VAL
50 CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
51 CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
52 CASE(VK_ERROR_INITIALIZATION_FAILED);
53 CASE(VK_ERROR_DEVICE_LOST);
54 CASE(VK_ERROR_MEMORY_MAP_FAILED);
55 CASE(VK_ERROR_LAYER_NOT_PRESENT);
56 CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
57 CASE(VK_ERROR_FEATURE_NOT_PRESENT);
58 CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
59 CASE(VK_ERROR_TOO_MANY_OBJECTS);
60 CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
61 CASE(VK_ERROR_FRAGMENTED_POOL);
62 CASE(VK_ERROR_UNKNOWN);
63 CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
64 CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
65 CASE(VK_ERROR_FRAGMENTATION);
66 CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
67 CASE(VK_PIPELINE_COMPILE_REQUIRED);
68 CASE(VK_ERROR_SURFACE_LOST_KHR);
69 CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
70 CASE(VK_SUBOPTIMAL_KHR);
71 CASE(VK_ERROR_OUT_OF_DATE_KHR);
72 CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
73 CASE(VK_ERROR_VALIDATION_FAILED_EXT);
74 CASE(VK_ERROR_INVALID_SHADER_NV);
75 CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR);
76 CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR);
77 CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR);
78 CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR);
79 CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR);
80 CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
81 CASE(VK_ERROR_NOT_PERMITTED_KHR);
82 CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
83 CASE(VK_THREAD_IDLE_KHR);
84 CASE(VK_THREAD_DONE_KHR);
85 CASE(VK_OPERATION_DEFERRED_KHR);
86 CASE(VK_OPERATION_NOT_DEFERRED_KHR);
87 default:
return "Unknown error";
93 #define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \
94 dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \
97 MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \
98 VK_IMAGE_USAGE_SAMPLED_BIT); \
99 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \
100 VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \
101 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \
102 VK_IMAGE_USAGE_TRANSFER_DST_BIT); \
103 MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \
104 VK_IMAGE_USAGE_STORAGE_BIT); \
105 MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \
106 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \
107 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \
108 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \
109 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \
110 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \
111 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \
112 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \
113 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \
114 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \
115 MAP_TO(VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT, \
116 VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT); \
120 #define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1;
121 FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags,
usage)
123 #define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2;
124 FN_MAP_TO(VkImageUsageFlags,
usage, VkFormatFeatureFlagBits2, feats)
131 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
134 for (
int j = 0; j <
s->nb_qfs; j++) {
135 if (
s->qfs[j] ==
s->hwctx->qf[
i].idx) {
143 s->qfs[
s->nb_qfs++] =
s->hwctx->qf[
i].idx;
151 s->props = (VkPhysicalDeviceProperties2) {
152 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
156 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES);
158 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
160 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES);
163 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR);
165 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
167 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
169 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
171 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT);
173 #ifdef VK_EXT_shader_long_vector
175 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT);
178 s->feats = (VkPhysicalDeviceFeatures2) {
179 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
183 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
185 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
188 s->host_image_copy_layouts =
av_malloc(
sizeof(*
s->host_image_copy_layouts)*1024);
189 s->host_image_props.pCopySrcLayouts =
s->host_image_copy_layouts;
190 s->host_image_props.copySrcLayoutCount = 512;
191 s->host_image_props.pCopyDstLayouts =
s->host_image_copy_layouts + 512;
192 s->host_image_props.copyDstLayoutCount = 512;
194 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
197 if (
s->host_image_props.copySrcLayoutCount == 512 ||
198 s->host_image_props.copyDstLayoutCount == 512) {
199 VkImageLayout *new_array;
201 s->host_image_props.pCopySrcLayouts =
202 s->host_image_props.pCopyDstLayouts =
NULL;
203 s->host_image_props.copySrcLayoutCount =
204 s->host_image_props.copyDstLayoutCount = 0;
205 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
207 new_size =
s->host_image_props.copySrcLayoutCount +
208 s->host_image_props.copyDstLayoutCount;
209 new_size *=
sizeof(*
s->host_image_copy_layouts);
210 new_array =
av_realloc(
s->host_image_copy_layouts, new_size);
214 s->host_image_copy_layouts = new_array;
215 s->host_image_props.pCopySrcLayouts = new_array;
216 s->host_image_props.pCopyDstLayouts = new_array +
s->host_image_props.copySrcLayoutCount;
217 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
220 vk->GetPhysicalDeviceMemoryProperties(
s->hwctx->phys_dev, &
s->mprops);
221 vk->GetPhysicalDeviceFeatures2(
s->hwctx->phys_dev, &
s->feats);
223 for (
int i = 0;
i <
s->mprops.memoryTypeCount;
i++)
224 s->host_cached_flag |=
s->mprops.memoryTypes[
i].propertyFlags &
225 VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
232 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
NULL);
234 s->qf_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->qf_props));
238 s->query_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->query_props));
244 s->video_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->video_props));
245 if (!
s->video_props) {
251 for (uint32_t
i = 0;
i <
s->tot_nb_qfs;
i++) {
252 s->qf_props[
i] = (VkQueueFamilyProperties2) {
253 .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
257 VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR);
259 VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR);
262 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
s->qf_props);
265 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
266 &
s->coop_mat_props_nb,
NULL);
268 if (
s->coop_mat_props_nb) {
270 sizeof(VkCooperativeMatrixPropertiesKHR));
271 for (
int i = 0;
i <
s->coop_mat_props_nb;
i++) {
272 s->coop_mat_props[
i] = (VkCooperativeMatrixPropertiesKHR) {
273 .sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
277 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
278 &
s->coop_mat_props_nb,
287 VkQueueFlagBits dev_family,
288 VkVideoCodecOperationFlagBitsKHR vid_ops)
290 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
291 if ((
s->hwctx->qf[
i].flags & dev_family) &&
292 (
s->hwctx->qf[
i].video_caps & vid_ops) == vid_ops) {
293 return &
s->hwctx->qf[
i];
308 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
309 vk->DestroyFence(
s->hwctx->act_dev, e->
fence,
s->hwctx->alloc);
332 vk->DestroyDescriptorPool(
s->hwctx->act_dev, sd->
desc_pool,
345 vk->DestroyCommandPool(
s->hwctx->act_dev, pool->
cmd_buf_pools[
i],
s->hwctx->alloc);
348 vk->DestroyQueryPool(
s->hwctx->act_dev, pool->
query_pool,
s->hwctx->alloc);
359 int nb_queries, VkQueryType query_type,
int query_64bit,
360 const void *query_create_pnext)
367 VkCommandBufferAllocateInfo cbuf_create;
369 const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *ef =
NULL;
373 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
375 VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR);
394 for (
int i = 0;
i < nb_contexts;
i++) {
397 .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
398 .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
399 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
400 .queueFamilyIndex = qf->
idx,
405 if (
ret != VK_SUCCESS) {
413 cbuf_create = (VkCommandBufferAllocateInfo) {
414 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
415 .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
417 .commandBufferCount = 1,
419 ret = vk->AllocateCommandBuffers(
s->hwctx->act_dev, &cbuf_create,
421 if (
ret != VK_SUCCESS) {
431 VkQueryPoolCreateInfo query_pool_info = {
432 .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
433 .pNext = query_create_pnext,
434 .queryType = query_type,
435 .queryCount = nb_queries*nb_contexts,
437 ret = vk->CreateQueryPool(
s->hwctx->act_dev, &query_pool_info,
439 if (
ret != VK_SUCCESS) {
452 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
453 int nb_results =
av_popcount(ef->encodeFeedbackFlags);
456 }
else if (query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR) {
480 #ifdef VK_KHR_internally_synchronized_queues
482 int internal_queue_sync = 0;
484 const VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR *iqs;
486 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR);
487 internal_queue_sync = iqs && iqs->internallySynchronizedQueues;
494 VkFenceCreateInfo fence_create = {
495 .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
496 .flags = VK_FENCE_CREATE_SIGNALED_BIT,
500 ret = vk->CreateFence(
s->hwctx->act_dev, &fence_create,
s->hwctx->alloc,
502 if (
ret != VK_SUCCESS) {
521 VkDeviceQueueInfo2 qinfo = {
522 .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2,
523 #ifdef VK_KHR_internally_synchronized_queues
524 .flags = internal_queue_sync ?
525 VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR : 0,
527 .queueFamilyIndex = qf->
idx,
530 vk->GetDeviceQueue2(
s->hwctx->act_dev, &qinfo, &e->
queue);
541 void **
data, VkQueryResultFlagBits
flags)
545 VkQueryResultFlags qf =
flags & ~(VK_QUERY_RESULT_64_BIT |
546 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR);
550 return VK_INCOMPLETE;
554 VK_QUERY_RESULT_64_BIT : 0x0;
556 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR : 0x0;
561 return vk->GetQueryPoolResults(
s->hwctx->act_dev, pool->
query_pool,
576 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
586 VkCommandBufferBeginInfo cmd_start = {
587 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
588 .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
592 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
593 vk->ResetFences(
s->hwctx->act_dev, 1, &e->
fence);
598 ret = vk->BeginCommandBuffer(e->
buf, &cmd_start);
599 if (
ret != VK_SUCCESS) {
628 vkfc->unlock_frame(hwfc, vkf);
652 for (
int i = 0;
i < nb_deps;
i++) {
690 #define ARR_REALLOC(str, arr, alloc_s, cnt) \
692 arr = av_fast_realloc(str->arr, alloc_s, (cnt + 1)*sizeof(*arr)); \
694 ff_vk_exec_discard_deps(s, e); \
695 return AVERROR(ENOMEM); \
712 vk->DestroySemaphore(
s->hwctx->act_dev, ts->
sem[
i],
s->hwctx->alloc);
718 VkSemaphore sem, uint64_t
val,
719 VkPipelineStageFlagBits2 stage)
725 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
735 VkSemaphore *sem,
int nb,
736 VkPipelineStageFlagBits2 stage,
748 for (
int i = 0;
i < nb;
i++) {
749 VkSemaphoreSubmitInfo *sem_sig;
753 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
762 buf_size =
sizeof(*ts) +
sizeof(VkSemaphore)*nb;
769 memcpy(ts->sem, sem, nb*
sizeof(*sem));
785 for (
int i = 0;
i < nb;
i++) {
794 for (
int i = 0;
i < nb;
i++)
795 vk->DestroySemaphore(
s->hwctx->act_dev, sem[
i],
s->hwctx->alloc);
801 VkPipelineStageFlagBits2 wait_stage,
802 VkPipelineStageFlagBits2 signal_stage)
804 uint8_t *frame_locked;
805 uint8_t *frame_update;
808 VkImageLayout *layout_dst;
809 uint32_t *queue_family_dst;
810 VkAccessFlagBits *access_dst;
845 vkfc->lock_frame(hwfc, vkf);
850 for (
int i = 0;
i < nb_images;
i++) {
852 VkSemaphoreSubmitInfo *sem_sig;
853 uint64_t **sem_sig_val_dst;
860 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
861 .semaphore = vkf->sem[
i],
862 .value = vkf->sem_value[
i],
863 .stageMask = wait_stage,
867 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
868 .semaphore = vkf->sem[
i],
869 .value = vkf->sem_value[
i] + 1,
870 .stageMask = signal_stage,
881 VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
900 VkSemaphore *
dst, uint64_t *dst_val,
903 uint64_t **sem_sig_val_dst;
929 VkCommandBufferSubmitInfo cmd_buf_info = (VkCommandBufferSubmitInfo) {
930 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
931 .commandBuffer = e->
buf,
933 VkSubmitInfo2 submit_info = (VkSubmitInfo2) {
934 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
935 .pCommandBufferInfos = &cmd_buf_info,
936 .commandBufferInfoCount = 1,
939 .pSignalSemaphoreInfos = e->
sem_sig,
943 ret = vk->EndCommandBuffer(e->
buf);
944 if (
ret != VK_SUCCESS) {
951 #if FF_API_VULKAN_SYNC_QUEUES
953 s->hwctx->lock_queue(
s->device, e->
qf, e->
qi);
957 #if FF_API_VULKAN_SYNC_QUEUES
959 s->hwctx->unlock_queue(
s->device, e->
qf, e->
qi);
963 if (
ret != VK_SUCCESS) {
983 for (
int i = 0;
i < nb_images;
i++) {
989 vkfc->unlock_frame(hwfc, vkf);
1000 VkMemoryPropertyFlagBits req_flags,
void *alloc_extension,
1001 VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
1007 VkMemoryAllocateInfo alloc_info = {
1008 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
1009 .pNext = alloc_extension,
1012 alloc_info.allocationSize = req->size;
1016 for (
int i = 0;
i <
s->mprops.memoryTypeCount;
i++) {
1018 if (!(req->memoryTypeBits & (1 <<
i)))
1022 if ((req_flags != UINT32_MAX) &&
1023 ((
s->mprops.memoryTypes[
i].propertyFlags & req_flags) != req_flags))
1037 alloc_info.memoryTypeIndex =
index;
1039 ret = vk->AllocateMemory(
s->hwctx->act_dev, &alloc_info,
1040 s->hwctx->alloc, mem);
1041 if (
ret != VK_SUCCESS)
1045 *mem_flags |=
s->mprops.memoryTypes[
index].propertyFlags;
1051 void *pNext,
void *alloc_pNext,
1052 VkBufferUsageFlags
usage, VkMemoryPropertyFlagBits
flags)
1059 VkBufferCreateInfo buf_spawn = {
1060 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1063 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1064 .size =
flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ?
1065 FFALIGN(
size,
s->props.properties.limits.minMemoryMapAlignment) :
1069 VkMemoryAllocateFlagsInfo alloc_flags = {
1070 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1071 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1073 VkBufferMemoryRequirementsInfo2 req_desc = {
1074 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
1076 VkMemoryDedicatedAllocateInfo ded_alloc = {
1077 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1078 .pNext = alloc_pNext,
1080 VkMemoryDedicatedRequirements ded_req = {
1081 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
1083 VkMemoryRequirements2 req = {
1084 .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
1089 "usage: 0x%x, flags: 0x%x\n",
1092 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &buf->
buf);
1093 if (
ret != VK_SUCCESS) {
1099 req_desc.buffer = buf->
buf;
1101 vk->GetBufferMemoryRequirements2(
s->hwctx->act_dev, &req_desc, &req);
1104 use_ded_mem = ded_req.prefersDedicatedAllocation |
1105 ded_req.requiresDedicatedAllocation;
1107 ded_alloc.buffer = buf->
buf;
1108 ded_alloc.pNext = alloc_pNext;
1109 alloc_pNext = &ded_alloc;
1112 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1113 alloc_flags.pNext = alloc_pNext;
1114 alloc_pNext = &alloc_flags;
1122 ret = vk->BindBufferMemory(
s->hwctx->act_dev, buf->
buf, buf->
mem, 0);
1123 if (
ret != VK_SUCCESS) {
1129 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1130 VkBufferDeviceAddressInfo address_info = {
1131 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1134 buf->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1143 int nb_buffers,
int invalidate)
1147 VkMappedMemoryRange inval_list[64];
1148 int inval_count = 0;
1150 for (
int i = 0;
i < nb_buffers;
i++) {
1152 ret = vk->MapMemory(
s->hwctx->act_dev, buf[
i]->
mem, 0,
1153 VK_WHOLE_SIZE, 0, &
dst);
1154 if (
ret != VK_SUCCESS) {
1167 for (
int i = 0;
i < nb_buffers;
i++) {
1168 const VkMappedMemoryRange ival_buf = {
1169 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1170 .memory = buf[
i]->
mem,
1171 .size = VK_WHOLE_SIZE,
1173 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1175 inval_list[inval_count++] = ival_buf;
1179 ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, inval_count,
1181 if (
ret != VK_SUCCESS) {
1192 VkDeviceSize
offset, VkDeviceSize mem_size,
1198 if (buf->
host_ref || buf->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1201 const VkMappedMemoryRange flush_data = {
1202 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1209 ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, 1, &flush_data);
1211 ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, 1, &flush_data);
1213 if (
ret != VK_SUCCESS) {
1228 VkMappedMemoryRange flush_list[64];
1229 int flush_count = 0;
1232 for (
int i = 0;
i < nb_buffers;
i++) {
1233 const VkMappedMemoryRange flush_buf = {
1234 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1235 .memory = buf[
i]->
mem,
1236 .size = VK_WHOLE_SIZE,
1240 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1242 flush_list[flush_count++] = flush_buf;
1247 ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, flush_count,
1249 if (
ret != VK_SUCCESS) {
1256 for (
int i = 0;
i < nb_buffers;
i++) {
1257 vk->UnmapMemory(
s->hwctx->act_dev, buf[
i]->
mem);
1268 if (!buf || !
s->hwctx)
1273 if (buf->
buf != VK_NULL_HANDLE)
1274 vk->DestroyBuffer(
s->hwctx->act_dev, buf->
buf,
s->hwctx->alloc);
1275 if (buf->
mem != VK_NULL_HANDLE)
1276 vk->FreeMemory(
s->hwctx->act_dev, buf->
mem,
s->hwctx->alloc);
1280 buf->
buf = VK_NULL_HANDLE;
1281 buf->
mem = VK_NULL_HANDLE;
1308 void *create_pNext,
size_t size,
1309 VkMemoryPropertyFlagBits mem_props)
1345 if (mem_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
1360 VkExternalMemoryBufferCreateInfo *create_desc,
1361 VkImportMemoryHostPointerInfoEXT *import_desc,
1362 VkMemoryHostPointerPropertiesEXT props)
1368 VkBufferCreateInfo buf_spawn = {
1369 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1370 .pNext = create_desc,
1372 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1375 VkMemoryRequirements req = {
1377 .alignment =
s->hprops.minImportedHostPointerAlignment,
1378 .memoryTypeBits = props.memoryTypeBits,
1382 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1383 import_desc, &vkb->
flags, &vkb->
mem);
1387 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &vkb->
buf);
1388 if (
ret != VK_SUCCESS) {
1389 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1393 ret = vk->BindBufferMemory(
s->hwctx->act_dev, vkb->
buf, vkb->
mem, 0);
1394 if (
ret != VK_SUCCESS) {
1395 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1396 vk->DestroyBuffer(
s->hwctx->act_dev, vkb->
buf,
s->hwctx->alloc);
1413 VkBufferUsageFlags
usage)
1419 VkExternalMemoryBufferCreateInfo create_desc = {
1420 .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1421 .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1423 VkMemoryAllocateFlagsInfo alloc_flags = {
1424 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1425 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1427 VkImportMemoryHostPointerInfoEXT import_desc = {
1428 .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
1429 .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1430 .pNext =
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT ? &alloc_flags :
NULL,
1432 VkMemoryHostPointerPropertiesEXT props;
1442 offs = (uintptr_t)src_data %
s->hprops.minImportedHostPointerAlignment;
1443 import_desc.pHostPointer = src_data - offs;
1445 props = (VkMemoryHostPointerPropertiesEXT) {
1446 VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT,
1448 ret = vk->GetMemoryHostPointerPropertiesEXT(
s->hwctx->act_dev,
1449 import_desc.handleType,
1450 import_desc.pHostPointer,
1452 if (!(
ret == VK_SUCCESS && props.memoryTypeBits))
1461 const ptrdiff_t src_offset = src_data - src_buf->
data;
1462 buffer_size = offs + (src_buf->
size - src_offset);
1463 buffer_size =
FFALIGN(buffer_size,
s->props.properties.limits.minMemoryMapAlignment);
1464 buffer_size =
FFALIGN(buffer_size,
s->hprops.minImportedHostPointerAlignment);
1474 buffer_size, &create_desc, &import_desc,
1482 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1483 VkBufferDeviceAddressInfo address_info = {
1484 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1487 vkb->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1494 vkb->
size = buffer_size - offs;
1495 vkb->
flags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
1510 VkShaderStageFlagBits stage)
1514 pc->stageFlags = stage;
1521 int unnorm_coords, VkFilter
filt)
1526 VkSamplerCreateInfo sampler_info = {
1527 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1529 .minFilter = sampler_info.magFilter,
1530 .mipmapMode = unnorm_coords ? VK_SAMPLER_MIPMAP_MODE_NEAREST :
1531 VK_SAMPLER_MIPMAP_MODE_LINEAR,
1532 .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
1533 .addressModeV = sampler_info.addressModeU,
1534 .addressModeW = sampler_info.addressModeU,
1535 .anisotropyEnable = VK_FALSE,
1536 .compareOp = VK_COMPARE_OP_NEVER,
1537 .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
1538 .unnormalizedCoordinates = unnorm_coords,
1541 ret = vk->CreateSampler(
s->hwctx->act_dev, &sampler_info,
1542 s->hwctx->alloc, sampler);
1543 if (
ret != VK_SUCCESS) {
1559 static const VkImageAspectFlags plane_aspect[] = { VK_IMAGE_ASPECT_PLANE_0_BIT,
1560 VK_IMAGE_ASPECT_PLANE_1_BIT,
1561 VK_IMAGE_ASPECT_PLANE_2_BIT, };
1564 return VK_IMAGE_ASPECT_COLOR_BIT;
1566 return plane_aspect[
p];
1630 int lut_tmp[4] = { lut[0], lut[1], lut[2], lut[3] };
1631 for (
int i = 0;
i < 4;
i++)
1632 lut[lut_tmp[
i]] =
i;
1653 const char *rep_tab[] = {
1659 return rep_tab[rep_fmt];
1665 const char *rep_tab[] = {
1671 return rep_tab[rep_fmt];
1679 const char *rep_tab[] = {
1685 return rep_tab[rep_fmt];
1688 const char *rep_tab[] = {
1694 return rep_tab[rep_fmt];
1698 const char *rep_tab[] = {
1704 return rep_tab[rep_fmt];
1708 const char *rep_tab[] = {
1714 return rep_tab[rep_fmt];
1725 const char *rep_tab[] = {
1731 return rep_tab[rep_fmt];
1765 const char *rep_tab[] = {
1771 return rep_tab[rep_fmt];
1777 const char *rep_tab[] = {
1783 return rep_tab[rep_fmt];
1786 const char *rep_tab[] = {
1792 return rep_tab[rep_fmt];
1797 const char *rep_tab[] = {
1803 return rep_tab[rep_fmt];
1808 const char *rep_tab[] = {
1814 return rep_tab[rep_fmt];
1822 const char *rep_tab[] = {
1828 return rep_tab[rep_fmt];
1847 vk->DestroyImageView(
s->hwctx->act_dev, iv->
views[
i],
s->hwctx->alloc);
1854 #define REPS_FMT(fmt) \
1855 [FF_VK_REP_NATIVE] = fmt ## _UINT, \
1856 [FF_VK_REP_FLOAT] = fmt ## _UNORM, \
1857 [FF_VK_REP_INT] = fmt ## _SINT, \
1858 [FF_VK_REP_UINT] = fmt ## _UINT,
1860 #define REPS_FMT_PACK(fmt, num) \
1861 [FF_VK_REP_NATIVE] = fmt ## _UINT_PACK ## num, \
1862 [FF_VK_REP_FLOAT] = fmt ## _UNORM_PACK ## num, \
1863 [FF_VK_REP_INT] = fmt ## _SINT_PACK ## num, \
1864 [FF_VK_REP_UINT] = fmt ## _UINT_PACK ## num,
1870 VK_FORMAT_B5G6R5_UNORM_PACK16,
1871 VK_FORMAT_B5G6R5_UNORM_PACK16,
1872 VK_FORMAT_UNDEFINED,
1873 VK_FORMAT_UNDEFINED,
1876 VK_FORMAT_R5G6B5_UNORM_PACK16,
1877 VK_FORMAT_R5G6B5_UNORM_PACK16,
1878 VK_FORMAT_UNDEFINED,
1879 VK_FORMAT_UNDEFINED,
1890 {
REPS_FMT(VK_FORMAT_R16G16B16A16) },
1893 VK_FORMAT_R32_SFLOAT,
1898 VK_FORMAT_R32G32B32_SFLOAT,
1899 VK_FORMAT_R32G32B32_SFLOAT,
1900 VK_FORMAT_UNDEFINED,
1901 VK_FORMAT_UNDEFINED,
1904 VK_FORMAT_R16G16B16A16_SFLOAT,
1905 VK_FORMAT_R16G16B16A16_SFLOAT,
1906 VK_FORMAT_UNDEFINED,
1907 VK_FORMAT_UNDEFINED,
1910 VK_FORMAT_R32G32B32A32_SFLOAT,
1911 VK_FORMAT_R32G32B32A32_SFLOAT,
1912 VK_FORMAT_UNDEFINED,
1913 VK_FORMAT_UNDEFINED,
1916 VK_FORMAT_R32G32B32_UINT,
1917 VK_FORMAT_UNDEFINED,
1918 VK_FORMAT_R32G32B32_SINT,
1919 VK_FORMAT_R32G32B32_UINT,
1922 VK_FORMAT_R32G32B32A32_UINT,
1923 VK_FORMAT_UNDEFINED,
1924 VK_FORMAT_R32G32B32A32_SINT,
1925 VK_FORMAT_R32G32B32A32_UINT,
1928 VK_FORMAT_R16_SFLOAT,
1929 VK_FORMAT_R16_SFLOAT,
1930 VK_FORMAT_UNDEFINED,
1931 VK_FORMAT_UNDEFINED,
1934 #undef REPS_FMT_PACK
1937 if (fmt == VK_FORMAT_UNDEFINED)
1938 return VK_FORMAT_UNDEFINED;
1945 return fmts_map[
i][rep_fmt];
1948 return VK_FORMAT_UNDEFINED;
1952 VkImageView *img_view, VkImageAspectFlags *aspect,
1963 VkImageViewUsageCreateInfo view_usage_info = {
1964 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
1965 .usage = vkfc->usage &
1966 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
1967 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
1969 VkImageViewCreateInfo view_create_info = {
1970 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1971 .pNext = &view_usage_info,
1972 .image = vkf->
img[
FFMIN(plane, nb_images - 1)],
1973 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1976 .subresourceRange = {
1982 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
1984 "of format %i and mode %i\n",
1985 rep_fmts[plane], rep_fmt);
1989 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
1990 s->hwctx->alloc, img_view);
1991 if (
ret != VK_SUCCESS) {
1997 *aspect = view_create_info.subresourceRange.aspectMask;
2018 const size_t buf_size =
sizeof(*iv) + nb_planes*
sizeof(VkImageView);
2023 for (
int i = 0;
i < nb_planes;
i++) {
2024 VkImageViewUsageCreateInfo view_usage_info = {
2025 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
2026 .usage = vkfc->usage &
2027 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
2028 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
2030 VkImageViewCreateInfo view_create_info = {
2031 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
2032 .pNext = &view_usage_info,
2033 .image = vkf->
img[
FFMIN(
i, nb_images - 1)],
2034 .viewType = VK_IMAGE_VIEW_TYPE_2D,
2037 .subresourceRange = {
2043 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
2045 "of format %i and mode %i\n",
2046 rep_fmts[
i], rep_fmt);
2051 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
2052 s->hwctx->alloc, &iv->views[
i]);
2053 if (
ret != VK_SUCCESS) {
2074 memcpy(views, iv->views, nb_planes*
sizeof(*views));
2079 for (
int i = 0;
i < iv->nb_views;
i++)
2080 vk->DestroyImageView(
s->hwctx->act_dev, iv->views[
i],
s->hwctx->alloc);
2086 AVFrame *pic, VkImageMemoryBarrier2 *bar,
int *nb_bar,
2087 VkPipelineStageFlags2 src_stage,
2088 VkPipelineStageFlags2 dst_stage,
2089 VkAccessFlagBits2 new_access,
2090 VkImageLayout new_layout,
2103 for (
int i = 0;
i < nb_images;
i++) {
2104 bar[*nb_bar] = (VkImageMemoryBarrier2) {
2105 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
2107 .srcStageMask = src_stage,
2108 .dstStageMask = dst_stage,
2110 .dstAccessMask = new_access,
2112 .newLayout = new_layout,
2114 .dstQueueFamilyIndex = new_qf,
2115 .image = vkf->
img[
i],
2116 .subresourceRange = (VkImageSubresourceRange) {
2117 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
2129 VkPipelineStageFlags stage, VkSpecializationInfo *spec,
2130 uint32_t wg_size[3], uint32_t required_subgroup_size)
2135 memcpy(shd->
lg_size, wg_size, 3*
sizeof(uint32_t));
2137 switch (shd->
stage) {
2138 case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
2139 case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
2140 case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
2141 case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
2142 case VK_SHADER_STAGE_MISS_BIT_KHR:
2143 case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
2144 shd->
bind_point = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR;
2146 case VK_SHADER_STAGE_COMPUTE_BIT:
2147 shd->
bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
2150 shd->
bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
2158 VkPipelineStageFlags stage,
2159 const char *extensions[],
int nb_extensions,
2160 int lg_x,
int lg_y,
int lg_z,
2161 uint32_t required_subgroup_size)
2164 (uint32_t []) { lg_x, lg_y, lg_z }, required_subgroup_size);
2170 if (required_subgroup_size) {
2171 shd->
subgroup_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO;
2172 shd->
subgroup_info.requiredSubgroupSize = required_subgroup_size;
2176 (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
2177 stage == VK_SHADER_STAGE_MESH_BIT_EXT) ?
2179 (shd->
bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) ?
2181 (shd->
bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) ?
2182 "Compute" :
"Graphics",
2188 GLSLC(0, #define IS_WITHIN(v1, v2) ((v1.x < v2.x) && (v1.y < v2.y)) );
2190 GLSLC(0, #extension GL_EXT_scalar_block_layout : require );
2191 GLSLC(0, #extension GL_EXT_shader_explicit_arithmetic_types : require );
2192 GLSLC(0, #extension GL_EXT_control_flow_attributes : require );
2193 GLSLC(0, #extension GL_EXT_shader_image_load_formatted : require );
2195 GLSLC(0, #extension GL_EXT_expect_assume : require );
2197 GLSLC(0, #define assumeEXT(x) (x) );
2198 GLSLC(0, #define expectEXT(x,
c) (x) );
2202 GLSLC(0, #extension GL_EXT_debug_printf : require );
2206 if (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
2207 stage == VK_SHADER_STAGE_MESH_BIT_EXT)
2208 GLSLC(0, #extension GL_EXT_mesh_shader : require );
2210 for (
int i = 0;
i < nb_extensions;
i++)
2211 GLSLF(0, #extension %
s : %
s ,extensions[
i],
"require");
2214 GLSLF(0,
layout (local_size_x = %
i, local_size_y = %
i, local_size_z = %
i) in;
2224 const char *
p = shd->
src.str;
2225 const char *start =
p;
2226 const size_t len = strlen(
p);
2231 for (
int i = 0;
i <
len;
i++) {
2247 VkPipelineLayoutCreateInfo pipeline_layout_info;
2250 pipeline_layout_info = (VkPipelineLayoutCreateInfo) {
2251 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2258 ret = vk->CreatePipelineLayout(
s->hwctx->act_dev, &pipeline_layout_info,
2260 if (
ret != VK_SUCCESS) {
2270 VkShaderModule *
mod,
2271 const uint8_t *spirv,
size_t spirv_len)
2276 VkShaderModuleCreateInfo shader_module_info = {
2277 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2280 .pCode = (
void *)spirv,
2281 .codeSize = spirv_len,
2284 ret = vk->CreateShaderModule(
s->hwctx->act_dev, &shader_module_info,
2285 s->hwctx->alloc,
mod);
2286 if (
ret != VK_SUCCESS) {
2296 VkShaderModule
mod,
const char *entrypoint)
2301 VkComputePipelineCreateInfo pipeline_create_info = {
2302 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2305 .stage = (VkPipelineShaderStageCreateInfo) {
2306 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2309 .pName = entrypoint,
2311 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT : 0x0,
2312 .stage = shd->
stage,
2318 ret = vk->CreateComputePipelines(
s->hwctx->act_dev, VK_NULL_HANDLE, 1,
2319 &pipeline_create_info,
2321 if (
ret != VK_SUCCESS) {
2331 const uint8_t *spirv,
size_t spirv_len,
2332 size_t *binary_size,
const char *entrypoint)
2337 VkShaderCreateInfoEXT shader_obj_create = {
2338 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
2340 VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT : 0x0,
2341 .stage = shd->
stage,
2343 .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
2345 .codeSize = spirv_len,
2346 .pName = entrypoint,
2354 ret = vk->CreateShadersEXT(
s->hwctx->act_dev, 1, &shader_obj_create,
2355 s->hwctx->alloc, &shd->
object);
2356 if (
ret != VK_SUCCESS) {
2362 if (vk->GetShaderBinaryDataEXT(
s->hwctx->act_dev, shd->
object,
2363 binary_size,
NULL) != VK_SUCCESS)
2374 int has_singular = 0;
2375 int max_descriptors = 0;
2382 (max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
2384 (has_singular == 0);
2388 VkDescriptorSetLayoutCreateInfo desc_layout_create = {
2389 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2390 .bindingCount =
set->nb_bindings,
2391 .pBindings =
set->binding,
2393 VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR :
2397 ret = vk->CreateDescriptorSetLayout(
s->hwctx->act_dev,
2398 &desc_layout_create,
2401 if (
ret != VK_SUCCESS) {
2412 const char *spirv,
size_t spirv_len,
2413 const char *entrypoint)
2417 VkSpecializationMapEntry spec_entries[3];
2418 VkSpecializationInfo spec_info;
2419 size_t input_size = spirv_len, binary_size = 0;
2423 spec_info = (VkSpecializationInfo) {
2424 .pMapEntries = spec_entries,
2433 for (
int i = 0;
i < 3;
i++) {
2435 .constantID = 253 +
i,
2437 .
size =
sizeof(uint32_t),
2443 shd->
lg_size, 3*
sizeof(uint32_t));
2446 #if CONFIG_SHADER_COMPRESSION
2453 spirv_len = out_len;
2467 &binary_size, entrypoint);
2477 case VK_PIPELINE_BIND_POINT_COMPUTE:
2488 vk->DestroyShaderModule(
s->hwctx->act_dev,
mod,
s->hwctx->alloc);
2498 if (input_size != spirv_len)
2501 if (binary_size != spirv_len)
2510 #if CONFIG_SHADER_COMPRESSION
2525 [VK_DESCRIPTOR_TYPE_SAMPLER] = {
sizeof(VkDescriptorImageInfo),
"sampler", 1, 0, 0, 0, },
2526 [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] = {
sizeof(VkDescriptorImageInfo),
"texture", 1, 0, 1, 0, },
2527 [VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] = {
sizeof(VkDescriptorImageInfo),
"image", 1, 1, 1, 0, },
2528 [VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT] = {
sizeof(VkDescriptorImageInfo),
"subpassInput", 1, 0, 0, 0, },
2529 [VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] = {
sizeof(VkDescriptorImageInfo),
"sampler", 1, 0, 1, 0, },
2530 [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER] = {
sizeof(VkDescriptorBufferInfo),
NULL, 1, 0, 0, 1, },
2531 [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] = {
sizeof(VkDescriptorBufferInfo),
"buffer", 0, 1, 0, 1, },
2532 [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] = {
sizeof(VkDescriptorBufferInfo),
NULL, 1, 0, 0, 1, },
2533 [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] = {
sizeof(VkDescriptorBufferInfo),
"buffer", 0, 1, 0, 1, },
2534 [VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER] = {
sizeof(VkBufferView),
"samplerBuffer", 1, 0, 0, 0, },
2535 [VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER] = {
sizeof(VkBufferView),
"imageBuffer", 1, 0, 0, 0, },
2540 int singular,
int print_to_shader_only)
2542 if (print_to_shader_only)
2549 for (
int i = 0;
i < nb;
i++) {
2550 set->binding[
i].binding =
i;
2551 set->binding[
i].descriptorType =
desc[
i].type;
2553 set->binding[
i].stageFlags =
desc[
i].stages;
2554 set->binding[
i].pImmutableSamplers =
desc[
i].samplers;
2557 for (
int i = 0;
i < nb;
i++) {
2571 set->singular = singular;
2572 set->nb_bindings = nb;
2579 for (
int i = 0;
i < nb;
i++) {
2583 if (
desc[
i].mem_layout &&
2584 (
desc[
i].
type != VK_DESCRIPTOR_TYPE_STORAGE_IMAGE))
2597 if (
desc[
i].
type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
2598 if (
desc[
i].mem_layout) {
2599 int len = strlen(
desc[
i].mem_layout);
2600 if (
desc[
i].mem_layout[
len - 1] ==
'i' &&
2601 desc[
i].mem_layout[
len - 2] ==
'u') {
2603 }
else if (
desc[
i].mem_layout[
len - 1] ==
'i') {
2618 if (
desc[
i].buf_elems) {
2627 if (
desc[
i].elems > 0)
2653 VkDescriptorSetLayout *tmp_layouts;
2654 VkDescriptorSetAllocateInfo set_alloc_info;
2655 VkDescriptorPoolCreateInfo pool_create_info;
2660 pool_create_info = (VkDescriptorPoolCreateInfo) {
2661 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2668 ret = vk->CreateDescriptorPool(
s->hwctx->act_dev, &pool_create_info,
2670 if (
ret != VK_SUCCESS) {
2676 tmp_layouts =
av_malloc_array(pool_create_info.maxSets,
sizeof(*tmp_layouts));
2685 set_alloc_info = (VkDescriptorSetAllocateInfo) {
2686 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2688 .pSetLayouts = tmp_layouts,
2689 .descriptorSetCount = pool_create_info.maxSets,
2693 sizeof(*tmp_layouts));
2698 ret = vk->AllocateDescriptorSets(
s->hwctx->act_dev, &set_alloc_info,
2701 if (
ret != VK_SUCCESS) {
2723 VkWriteDescriptorSet *write_info)
2732 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2736 vk->CmdPushDescriptorSetKHR(e->
buf,
2743 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2750 VkImageView view, VkImageLayout
layout,
2755 VkDescriptorImageInfo desc_pool_write_info_img = {
2760 VkWriteDescriptorSet desc_pool_write_info = {
2761 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2763 .descriptorCount = 1,
2764 .dstArrayElement = offs,
2765 .descriptorType = desc_set->
binding[bind].descriptorType,
2766 .pImageInfo = &desc_pool_write_info_img,
2775 VkImageView *views,
int set,
int binding,
2776 VkImageLayout
layout, VkSampler sampler)
2781 for (
int i = 0;
i < nb_planes;
i++)
2788 int set,
int bind,
int elem,
2794 VkDescriptorBufferInfo desc_pool_write_info_buf = {
2799 VkWriteDescriptorSet desc_pool_write_info = {
2800 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2802 .descriptorCount = 1,
2803 .dstArrayElement = elem,
2804 .descriptorType = desc_set->
binding[bind].descriptorType,
2805 .pBufferInfo = &desc_pool_write_info_buf,
2814 VkShaderStageFlagBits stage,
2829 VkShaderStageFlagBits stages = shd->
stage;
2830 vk->CmdBindShadersEXT(e->
buf, 1, &stages, &shd->
object);
2852 if (shd->shader.module)
2853 vk->DestroyShaderModule(
s->hwctx->act_dev, shd->shader.module,
2858 vk->DestroyShaderEXT(
s->hwctx->act_dev, shd->
object,
s->hwctx->alloc);
2860 vk->DestroyPipeline(
s->hwctx->act_dev, shd->
pipeline,
s->hwctx->alloc);
2867 vk->DestroyDescriptorSetLayout(
s->hwctx->act_dev, shd->
desc_layout[
i],
2888 static const AVClass vulkan_context_class = {
2894 memset(
s, 0,
sizeof(*
s));
2895 s->log_parent = log_parent;
2896 s->class = &vulkan_context_class;
2904 s->hwfc =
s->frames->hwctx;
2906 device_ref =
s->frames->device_ref;
2910 if (!
s->device_ref) {
2916 s->hwctx =
s->device->hwctx;
2919 s->hwctx->nb_enabled_dev_extensions);
2921 s->hwctx->nb_enabled_inst_extensions);