28 .r = VK_COMPONENT_SWIZZLE_IDENTITY,
29 .g = VK_COMPONENT_SWIZZLE_IDENTITY,
30 .b = VK_COMPONENT_SWIZZLE_IDENTITY,
31 .a = VK_COMPONENT_SWIZZLE_IDENTITY,
37 #define CASE(VAL) case VAL: return #VAL
45 CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
46 CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
47 CASE(VK_ERROR_INITIALIZATION_FAILED);
48 CASE(VK_ERROR_DEVICE_LOST);
49 CASE(VK_ERROR_MEMORY_MAP_FAILED);
50 CASE(VK_ERROR_LAYER_NOT_PRESENT);
51 CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
52 CASE(VK_ERROR_FEATURE_NOT_PRESENT);
53 CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
54 CASE(VK_ERROR_TOO_MANY_OBJECTS);
55 CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
56 CASE(VK_ERROR_FRAGMENTED_POOL);
57 CASE(VK_ERROR_UNKNOWN);
58 CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
59 CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
60 CASE(VK_ERROR_FRAGMENTATION);
61 CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
62 CASE(VK_PIPELINE_COMPILE_REQUIRED);
63 CASE(VK_ERROR_SURFACE_LOST_KHR);
64 CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
65 CASE(VK_SUBOPTIMAL_KHR);
66 CASE(VK_ERROR_OUT_OF_DATE_KHR);
67 CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
68 CASE(VK_ERROR_VALIDATION_FAILED_EXT);
69 CASE(VK_ERROR_INVALID_SHADER_NV);
70 CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR);
71 CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR);
72 CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR);
73 CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR);
74 CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR);
75 CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
76 CASE(VK_ERROR_NOT_PERMITTED_KHR);
77 CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
78 CASE(VK_THREAD_IDLE_KHR);
79 CASE(VK_THREAD_DONE_KHR);
80 CASE(VK_OPERATION_DEFERRED_KHR);
81 CASE(VK_OPERATION_NOT_DEFERRED_KHR);
82 default:
return "Unknown error";
88 #define FN_MAP_TO(dst_t, dst_name, src_t, src_name) \
89 dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \
92 MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT, \
93 VK_IMAGE_USAGE_SAMPLED_BIT); \
94 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT, \
95 VK_IMAGE_USAGE_TRANSFER_SRC_BIT); \
96 MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT, \
97 VK_IMAGE_USAGE_TRANSFER_DST_BIT); \
98 MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT, \
99 VK_IMAGE_USAGE_STORAGE_BIT); \
100 MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT, \
101 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); \
102 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR, \
103 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR); \
104 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR, \
105 VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR); \
106 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR, \
107 VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \
108 MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \
109 VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \
110 MAP_TO(VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT, \
111 VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT); \
115 #define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1;
116 FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags,
usage)
118 #define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2;
119 FN_MAP_TO(VkImageUsageFlags,
usage, VkFormatFeatureFlagBits2, feats)
126 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
129 for (
int j = 0; j <
s->nb_qfs; j++) {
130 if (
s->qfs[j] ==
s->hwctx->qf[
i].idx) {
138 s->qfs[
s->nb_qfs++] =
s->hwctx->qf[
i].idx;
146 s->props = (VkPhysicalDeviceProperties2) {
147 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
151 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES);
153 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
155 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES);
158 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR);
160 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
162 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
164 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT);
166 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
168 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT);
170 s->feats = (VkPhysicalDeviceFeatures2) {
171 .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
175 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
177 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
180 s->host_image_copy_layouts =
av_malloc(
sizeof(*
s->host_image_copy_layouts)*1024);
181 s->host_image_props.pCopySrcLayouts =
s->host_image_copy_layouts;
182 s->host_image_props.copySrcLayoutCount = 512;
183 s->host_image_props.pCopyDstLayouts =
s->host_image_copy_layouts + 512;
184 s->host_image_props.copyDstLayoutCount = 512;
186 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
189 if (
s->host_image_props.copySrcLayoutCount == 512 ||
190 s->host_image_props.copyDstLayoutCount == 512) {
191 VkImageLayout *new_array;
193 s->host_image_props.pCopySrcLayouts =
194 s->host_image_props.pCopyDstLayouts =
NULL;
195 s->host_image_props.copySrcLayoutCount =
196 s->host_image_props.copyDstLayoutCount = 0;
197 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
199 new_size =
s->host_image_props.copySrcLayoutCount +
200 s->host_image_props.copyDstLayoutCount;
201 new_size *=
sizeof(*
s->host_image_copy_layouts);
202 new_array =
av_realloc(
s->host_image_copy_layouts, new_size);
206 s->host_image_copy_layouts = new_array;
207 s->host_image_props.pCopySrcLayouts = new_array;
208 s->host_image_props.pCopyDstLayouts = new_array +
s->host_image_props.copySrcLayoutCount;
209 vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
212 vk->GetPhysicalDeviceMemoryProperties(
s->hwctx->phys_dev, &
s->mprops);
213 vk->GetPhysicalDeviceFeatures2(
s->hwctx->phys_dev, &
s->feats);
220 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
NULL);
222 s->qf_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->qf_props));
226 s->query_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->query_props));
232 s->video_props =
av_calloc(
s->tot_nb_qfs,
sizeof(*
s->video_props));
233 if (!
s->video_props) {
239 for (uint32_t
i = 0;
i <
s->tot_nb_qfs;
i++) {
240 s->qf_props[
i] = (VkQueueFamilyProperties2) {
241 .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
245 VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR);
247 VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR);
250 vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs,
s->qf_props);
253 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
254 &
s->coop_mat_props_nb,
NULL);
256 if (
s->coop_mat_props_nb) {
258 sizeof(VkCooperativeMatrixPropertiesKHR));
259 for (
int i = 0;
i <
s->coop_mat_props_nb;
i++) {
260 s->coop_mat_props[
i] = (VkCooperativeMatrixPropertiesKHR) {
261 .sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
265 vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
266 &
s->coop_mat_props_nb,
275 VkQueueFlagBits dev_family,
276 VkVideoCodecOperationFlagBitsKHR vid_ops)
278 for (
int i = 0;
i <
s->hwctx->nb_qf;
i++) {
279 if ((
s->hwctx->qf[
i].flags & dev_family) &&
280 (
s->hwctx->qf[
i].video_caps & vid_ops) == vid_ops) {
281 return &
s->hwctx->qf[
i];
296 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
297 vk->DestroyFence(
s->hwctx->act_dev, e->
fence,
s->hwctx->alloc);
329 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);
358 int nb_queries, VkQueryType query_type,
int query_64bit,
359 const void *query_create_pnext)
366 VkCommandBufferAllocateInfo cbuf_create;
368 const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *ef =
NULL;
372 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
374 VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR);
393 for (
int i = 0;
i < nb_contexts;
i++) {
396 .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
397 .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
398 VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
399 .queueFamilyIndex = qf->
idx,
404 if (
ret != VK_SUCCESS) {
412 cbuf_create = (VkCommandBufferAllocateInfo) {
413 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
414 .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
416 .commandBufferCount = 1,
418 ret = vk->AllocateCommandBuffers(
s->hwctx->act_dev, &cbuf_create,
420 if (
ret != VK_SUCCESS) {
430 VkQueryPoolCreateInfo query_pool_info = {
431 .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
432 .pNext = query_create_pnext,
433 .queryType = query_type,
434 .queryCount = nb_queries*nb_contexts,
436 ret = vk->CreateQueryPool(
s->hwctx->act_dev, &query_pool_info,
438 if (
ret != VK_SUCCESS) {
451 if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
452 int nb_results =
av_popcount(ef->encodeFeedbackFlags);
455 }
else if (query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR) {
482 VkFenceCreateInfo fence_create = {
483 .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
484 .flags = VK_FENCE_CREATE_SIGNALED_BIT,
488 ret = vk->CreateFence(
s->hwctx->act_dev, &fence_create,
s->hwctx->alloc,
490 if (
ret != VK_SUCCESS) {
509 vk->GetDeviceQueue(
s->hwctx->act_dev, qf->
idx, e->
qi, &e->
queue);
520 void **
data, VkQueryResultFlagBits
flags)
524 VkQueryResultFlags qf =
flags & ~(VK_QUERY_RESULT_64_BIT |
525 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR);
529 return VK_INCOMPLETE;
533 VK_QUERY_RESULT_64_BIT : 0x0;
535 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR : 0x0;
540 return vk->GetQueryPoolResults(
s->hwctx->act_dev, pool->
query_pool,
555 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
565 VkCommandBufferBeginInfo cmd_start = {
566 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
567 .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
571 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
572 vk->ResetFences(
s->hwctx->act_dev, 1, &e->
fence);
577 ret = vk->BeginCommandBuffer(e->
buf, &cmd_start);
578 if (
ret != VK_SUCCESS) {
607 vkfc->unlock_frame(hwfc, vkf);
631 for (
int i = 0;
i < nb_deps;
i++) {
669 #define ARR_REALLOC(str, arr, alloc_s, cnt) \
671 arr = av_fast_realloc(str->arr, alloc_s, (cnt + 1)*sizeof(*arr)); \
673 ff_vk_exec_discard_deps(s, e); \
674 return AVERROR(ENOMEM); \
691 vk->DestroySemaphore(
s->hwctx->act_dev, ts->
sem[
i],
s->hwctx->alloc);
697 VkSemaphore sem, uint64_t
val,
698 VkPipelineStageFlagBits2 stage)
704 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
714 VkSemaphore *sem,
int nb,
715 VkPipelineStageFlagBits2 stage,
727 for (
int i = 0;
i < nb;
i++) {
728 VkSemaphoreSubmitInfo *sem_sig;
732 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
741 buf_size =
sizeof(*ts) +
sizeof(VkSemaphore)*nb;
748 memcpy(ts->sem, sem, nb*
sizeof(*sem));
764 for (
int i = 0;
i < nb;
i++) {
773 for (
int i = 0;
i < nb;
i++)
774 vk->DestroySemaphore(
s->hwctx->act_dev, sem[
i],
s->hwctx->alloc);
780 VkPipelineStageFlagBits2 wait_stage,
781 VkPipelineStageFlagBits2 signal_stage)
783 uint8_t *frame_locked;
784 uint8_t *frame_update;
787 VkImageLayout *layout_dst;
788 uint32_t *queue_family_dst;
789 VkAccessFlagBits *access_dst;
824 vkfc->lock_frame(hwfc, vkf);
829 for (
int i = 0;
i < nb_images;
i++) {
831 VkSemaphoreSubmitInfo *sem_sig;
832 uint64_t **sem_sig_val_dst;
839 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
840 .semaphore = vkf->sem[
i],
841 .value = vkf->sem_value[
i],
842 .stageMask = wait_stage,
846 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
847 .semaphore = vkf->sem[
i],
848 .value = vkf->sem_value[
i] + 1,
849 .stageMask = signal_stage,
860 VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
879 VkSemaphore *
dst, uint64_t *dst_val,
882 uint64_t **sem_sig_val_dst;
908 VkCommandBufferSubmitInfo cmd_buf_info = (VkCommandBufferSubmitInfo) {
909 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
910 .commandBuffer = e->
buf,
912 VkSubmitInfo2 submit_info = (VkSubmitInfo2) {
913 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
914 .pCommandBufferInfos = &cmd_buf_info,
915 .commandBufferInfoCount = 1,
918 .pSignalSemaphoreInfos = e->
sem_sig,
922 ret = vk->EndCommandBuffer(e->
buf);
923 if (
ret != VK_SUCCESS) {
930 s->hwctx->lock_queue(
s->device, e->
qf, e->
qi);
932 s->hwctx->unlock_queue(
s->device, e->
qf, e->
qi);
934 if (
ret != VK_SUCCESS) {
954 for (
int i = 0;
i < nb_images;
i++) {
960 vkfc->unlock_frame(hwfc, vkf);
971 VkMemoryPropertyFlagBits req_flags,
void *alloc_extension,
972 VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
978 VkMemoryAllocateInfo alloc_info = {
979 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
980 .pNext = alloc_extension,
983 alloc_info.allocationSize = req->size;
987 for (
int i = 0;
i <
s->mprops.memoryTypeCount;
i++) {
989 if (!(req->memoryTypeBits & (1 <<
i)))
993 if ((req_flags != UINT32_MAX) &&
994 ((
s->mprops.memoryTypes[
i].propertyFlags & req_flags) != req_flags))
1008 alloc_info.memoryTypeIndex =
index;
1010 ret = vk->AllocateMemory(
s->hwctx->act_dev, &alloc_info,
1011 s->hwctx->alloc, mem);
1012 if (
ret != VK_SUCCESS)
1016 *mem_flags |=
s->mprops.memoryTypes[
index].propertyFlags;
1022 void *pNext,
void *alloc_pNext,
1023 VkBufferUsageFlags
usage, VkMemoryPropertyFlagBits
flags)
1031 const VkBufferUsageFlags desc_usage =
1032 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
1033 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
1034 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
1035 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
1038 usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
1040 VkBufferCreateInfo buf_spawn = {
1041 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1044 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1045 .size =
flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ?
1046 FFALIGN(
size,
s->props.properties.limits.minMemoryMapAlignment) :
1050 VkMemoryAllocateFlagsInfo alloc_flags = {
1051 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1052 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1054 VkBufferMemoryRequirementsInfo2 req_desc = {
1055 .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
1057 VkMemoryDedicatedAllocateInfo ded_alloc = {
1058 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
1059 .pNext = alloc_pNext,
1061 VkMemoryDedicatedRequirements ded_req = {
1062 .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
1064 VkMemoryRequirements2 req = {
1065 .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
1070 "usage: 0x%x, flags: 0x%x\n",
1073 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &buf->
buf);
1074 if (
ret != VK_SUCCESS) {
1080 req_desc.buffer = buf->
buf;
1082 vk->GetBufferMemoryRequirements2(
s->hwctx->act_dev, &req_desc, &req);
1085 use_ded_mem = ded_req.prefersDedicatedAllocation |
1086 ded_req.requiresDedicatedAllocation;
1088 ded_alloc.buffer = buf->
buf;
1089 ded_alloc.pNext = alloc_pNext;
1090 alloc_pNext = &ded_alloc;
1093 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1094 alloc_flags.pNext = alloc_pNext;
1095 alloc_pNext = &alloc_flags;
1103 ret = vk->BindBufferMemory(
s->hwctx->act_dev, buf->
buf, buf->
mem, 0);
1104 if (
ret != VK_SUCCESS) {
1110 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1111 VkBufferDeviceAddressInfo address_info = {
1112 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1115 buf->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1124 int nb_buffers,
int invalidate)
1128 VkMappedMemoryRange inval_list[64];
1129 int inval_count = 0;
1131 for (
int i = 0;
i < nb_buffers;
i++) {
1133 ret = vk->MapMemory(
s->hwctx->act_dev, buf[
i]->
mem, 0,
1134 VK_WHOLE_SIZE, 0, &
dst);
1135 if (
ret != VK_SUCCESS) {
1146 for (
int i = 0;
i < nb_buffers;
i++) {
1147 const VkMappedMemoryRange ival_buf = {
1148 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1149 .memory = buf[
i]->
mem,
1150 .size = VK_WHOLE_SIZE,
1152 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1154 inval_list[inval_count++] = ival_buf;
1158 ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, inval_count,
1160 if (
ret != VK_SUCCESS) {
1176 VkMappedMemoryRange flush_list[64];
1177 int flush_count = 0;
1180 for (
int i = 0;
i < nb_buffers;
i++) {
1181 const VkMappedMemoryRange flush_buf = {
1182 .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
1183 .memory = buf[
i]->
mem,
1184 .size = VK_WHOLE_SIZE,
1188 if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
1190 flush_list[flush_count++] = flush_buf;
1195 ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, flush_count,
1197 if (
ret != VK_SUCCESS) {
1204 for (
int i = 0;
i < nb_buffers;
i++) {
1205 vk->UnmapMemory(
s->hwctx->act_dev, buf[
i]->
mem);
1216 if (!buf || !
s->hwctx)
1221 if (buf->
buf != VK_NULL_HANDLE)
1222 vk->DestroyBuffer(
s->hwctx->act_dev, buf->
buf,
s->hwctx->alloc);
1223 if (buf->
mem != VK_NULL_HANDLE)
1224 vk->FreeMemory(
s->hwctx->act_dev, buf->
mem,
s->hwctx->alloc);
1228 buf->
buf = VK_NULL_HANDLE;
1229 buf->
mem = VK_NULL_HANDLE;
1256 void *create_pNext,
size_t size,
1257 VkMemoryPropertyFlagBits mem_props)
1277 data->stage = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
1278 data->access = VK_ACCESS_2_NONE;
1295 if (mem_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
1310 VkExternalMemoryBufferCreateInfo *create_desc,
1311 VkImportMemoryHostPointerInfoEXT *import_desc,
1312 VkMemoryHostPointerPropertiesEXT props)
1318 VkBufferCreateInfo buf_spawn = {
1319 .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
1320 .pNext = create_desc,
1322 .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
1325 VkMemoryRequirements req = {
1327 .alignment =
s->hprops.minImportedHostPointerAlignment,
1328 .memoryTypeBits = props.memoryTypeBits,
1332 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1333 import_desc, &vkb->
flags, &vkb->
mem);
1337 ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn,
s->hwctx->alloc, &vkb->
buf);
1338 if (
ret != VK_SUCCESS) {
1339 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1343 ret = vk->BindBufferMemory(
s->hwctx->act_dev, vkb->
buf, vkb->
mem, 0);
1344 if (
ret != VK_SUCCESS) {
1345 vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem,
s->hwctx->alloc);
1346 vk->DestroyBuffer(
s->hwctx->act_dev, vkb->
buf,
s->hwctx->alloc);
1363 VkBufferUsageFlags
usage)
1369 VkExternalMemoryBufferCreateInfo create_desc = {
1370 .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
1371 .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1373 VkMemoryAllocateFlagsInfo alloc_flags = {
1374 .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
1375 .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
1377 VkImportMemoryHostPointerInfoEXT import_desc = {
1378 .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
1379 .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
1380 .pNext =
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT ? &alloc_flags :
NULL,
1382 VkMemoryHostPointerPropertiesEXT props;
1392 offs = (uintptr_t)src_data %
s->hprops.minImportedHostPointerAlignment;
1393 import_desc.pHostPointer = src_data - offs;
1395 props = (VkMemoryHostPointerPropertiesEXT) {
1396 VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT,
1398 ret = vk->GetMemoryHostPointerPropertiesEXT(
s->hwctx->act_dev,
1399 import_desc.handleType,
1400 import_desc.pHostPointer,
1402 if (!(
ret == VK_SUCCESS && props.memoryTypeBits))
1411 buffer_size = offs + src_buf->
size;
1412 buffer_size =
FFALIGN(buffer_size,
s->props.properties.limits.minMemoryMapAlignment);
1413 buffer_size =
FFALIGN(buffer_size,
s->hprops.minImportedHostPointerAlignment);
1423 buffer_size, &create_desc, &import_desc,
1431 if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
1432 VkBufferDeviceAddressInfo address_info = {
1433 .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
1436 vkb->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
1443 vkb->
size = buffer_size - offs;
1444 vkb->
flags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
1459 VkShaderStageFlagBits stage)
1461 VkPushConstantRange *pc;
1470 memset(pc, 0,
sizeof(*pc));
1472 pc->stageFlags = stage;
1480 int unnorm_coords, VkFilter
filt)
1485 VkSamplerCreateInfo sampler_info = {
1486 .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
1488 .minFilter = sampler_info.magFilter,
1489 .mipmapMode = unnorm_coords ? VK_SAMPLER_MIPMAP_MODE_NEAREST :
1490 VK_SAMPLER_MIPMAP_MODE_LINEAR,
1491 .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
1492 .addressModeV = sampler_info.addressModeU,
1493 .addressModeW = sampler_info.addressModeU,
1494 .anisotropyEnable = VK_FALSE,
1495 .compareOp = VK_COMPARE_OP_NEVER,
1496 .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
1497 .unnormalizedCoordinates = unnorm_coords,
1500 ret = vk->CreateSampler(
s->hwctx->act_dev, &sampler_info,
1501 s->hwctx->alloc, sampler);
1502 if (
ret != VK_SUCCESS) {
1518 static const VkImageAspectFlags plane_aspect[] = { VK_IMAGE_ASPECT_PLANE_0_BIT,
1519 VK_IMAGE_ASPECT_PLANE_1_BIT,
1520 VK_IMAGE_ASPECT_PLANE_2_BIT, };
1523 return VK_IMAGE_ASPECT_COLOR_BIT;
1525 return plane_aspect[p];
1580 int lut_tmp[4] = { lut[0], lut[1], lut[2], lut[3] };
1581 for (
int i = 0;
i < 4;
i++)
1582 lut[lut_tmp[
i]] =
i;
1603 const char *rep_tab[] = {
1609 return rep_tab[rep_fmt];
1615 const char *rep_tab[] = {
1621 return rep_tab[rep_fmt];
1629 const char *rep_tab[] = {
1635 return rep_tab[rep_fmt];
1639 const char *rep_tab[] = {
1645 return rep_tab[rep_fmt];
1649 const char *rep_tab[] = {
1655 return rep_tab[rep_fmt];
1666 const char *rep_tab[] = {
1672 return rep_tab[rep_fmt];
1703 const char *rep_tab[] = {
1709 return rep_tab[rep_fmt];
1715 const char *rep_tab[] = {
1721 return rep_tab[rep_fmt];
1724 const char *rep_tab[] = {
1730 return rep_tab[rep_fmt];
1735 const char *rep_tab[] = {
1741 return rep_tab[rep_fmt];
1746 const char *rep_tab[] = {
1752 return rep_tab[rep_fmt];
1760 const char *rep_tab[] = {
1766 return rep_tab[rep_fmt];
1785 vk->DestroyImageView(
s->hwctx->act_dev, iv->
views[
i],
s->hwctx->alloc);
1792 #define REPS_FMT(fmt) \
1793 [FF_VK_REP_NATIVE] = fmt ## _UINT, \
1794 [FF_VK_REP_FLOAT] = fmt ## _UNORM, \
1795 [FF_VK_REP_INT] = fmt ## _SINT, \
1796 [FF_VK_REP_UINT] = fmt ## _UINT,
1798 #define REPS_FMT_PACK(fmt, num) \
1799 [FF_VK_REP_NATIVE] = fmt ## _UINT_PACK ## num, \
1800 [FF_VK_REP_FLOAT] = fmt ## _UNORM_PACK ## num, \
1801 [FF_VK_REP_INT] = fmt ## _SINT_PACK ## num, \
1802 [FF_VK_REP_UINT] = fmt ## _UINT_PACK ## num,
1808 VK_FORMAT_B5G6R5_UNORM_PACK16,
1809 VK_FORMAT_B5G6R5_UNORM_PACK16,
1810 VK_FORMAT_UNDEFINED,
1811 VK_FORMAT_UNDEFINED,
1814 VK_FORMAT_R5G6B5_UNORM_PACK16,
1815 VK_FORMAT_R5G6B5_UNORM_PACK16,
1816 VK_FORMAT_UNDEFINED,
1817 VK_FORMAT_UNDEFINED,
1828 {
REPS_FMT(VK_FORMAT_R16G16B16A16) },
1831 VK_FORMAT_R32_SFLOAT,
1836 VK_FORMAT_R32G32B32_SFLOAT,
1837 VK_FORMAT_R32G32B32_SFLOAT,
1838 VK_FORMAT_UNDEFINED,
1839 VK_FORMAT_UNDEFINED,
1842 VK_FORMAT_R32G32B32A32_SFLOAT,
1843 VK_FORMAT_R32G32B32A32_SFLOAT,
1844 VK_FORMAT_UNDEFINED,
1845 VK_FORMAT_UNDEFINED,
1848 VK_FORMAT_R32G32B32_UINT,
1849 VK_FORMAT_UNDEFINED,
1850 VK_FORMAT_R32G32B32_SINT,
1851 VK_FORMAT_R32G32B32_UINT,
1854 VK_FORMAT_R32G32B32A32_UINT,
1855 VK_FORMAT_UNDEFINED,
1856 VK_FORMAT_R32G32B32A32_SINT,
1857 VK_FORMAT_R32G32B32A32_UINT,
1860 #undef REPS_FMT_PACK
1863 if (fmt == VK_FORMAT_UNDEFINED)
1864 return VK_FORMAT_UNDEFINED;
1871 return fmts_map[
i][rep_fmt];
1874 return VK_FORMAT_UNDEFINED;
1878 VkImageView *img_view, VkImageAspectFlags *aspect,
1889 VkImageViewUsageCreateInfo view_usage_info = {
1890 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
1891 .usage = vkfc->usage &
1892 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
1893 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
1895 VkImageViewCreateInfo view_create_info = {
1896 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1897 .pNext = &view_usage_info,
1898 .image = vkf->
img[
FFMIN(plane, nb_images - 1)],
1899 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1902 .subresourceRange = {
1908 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
1910 "of format %i and mode %i\n",
1911 rep_fmts[plane], rep_fmt);
1915 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
1916 s->hwctx->alloc, img_view);
1917 if (
ret != VK_SUCCESS) {
1923 *aspect = view_create_info.subresourceRange.aspectMask;
1944 const size_t buf_size =
sizeof(*iv) + nb_planes*
sizeof(VkImageView);
1949 for (
int i = 0;
i < nb_planes;
i++) {
1950 VkImageViewUsageCreateInfo view_usage_info = {
1951 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
1952 .usage = vkfc->usage &
1953 (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
1954 VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
1956 VkImageViewCreateInfo view_create_info = {
1957 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1958 .pNext = &view_usage_info,
1959 .image = vkf->
img[
FFMIN(
i, nb_images - 1)],
1960 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1963 .subresourceRange = {
1969 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
1971 "of format %i and mode %i\n",
1972 rep_fmts[
i], rep_fmt);
1977 ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
1978 s->hwctx->alloc, &iv->views[
i]);
1979 if (
ret != VK_SUCCESS) {
2000 memcpy(views, iv->views, nb_planes*
sizeof(*views));
2005 for (
int i = 0;
i < iv->nb_views;
i++)
2006 vk->DestroyImageView(
s->hwctx->act_dev, iv->views[
i],
s->hwctx->alloc);
2012 AVFrame *pic, VkImageMemoryBarrier2 *bar,
int *nb_bar,
2013 VkPipelineStageFlags src_stage,
2014 VkPipelineStageFlags dst_stage,
2015 VkAccessFlagBits new_access,
2016 VkImageLayout new_layout,
2029 for (
int i = 0;
i < nb_images;
i++) {
2030 bar[*nb_bar] = (VkImageMemoryBarrier2) {
2031 .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
2033 .srcStageMask = src_stage,
2034 .dstStageMask = dst_stage,
2036 .dstAccessMask = new_access,
2038 .newLayout = new_layout,
2040 .dstQueueFamilyIndex = new_qf,
2041 .image = vkf->
img[
i],
2042 .subresourceRange = (VkImageSubresourceRange) {
2043 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
2055 VkPipelineStageFlags stage,
2056 const char *extensions[],
int nb_extensions,
2057 int lg_x,
int lg_y,
int lg_z,
2058 uint32_t required_subgroup_size)
2068 switch (shd->
stage) {
2069 case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
2070 case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
2071 case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
2072 case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
2073 case VK_SHADER_STAGE_MISS_BIT_KHR:
2074 case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
2075 shd->
bind_point = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR;
2077 case VK_SHADER_STAGE_COMPUTE_BIT:
2078 shd->
bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
2081 shd->
bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
2085 if (required_subgroup_size) {
2086 shd->
subgroup_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO;
2087 shd->
subgroup_info.requiredSubgroupSize = required_subgroup_size;
2091 (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
2092 stage == VK_SHADER_STAGE_MESH_BIT_EXT) ?
2094 (shd->
bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) ?
2096 (shd->
bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) ?
2097 "Compute" :
"Graphics",
2103 GLSLC(0, #define IS_WITHIN(v1, v2) ((v1.x < v2.x) && (v1.y < v2.y)) );
2105 GLSLC(0, #extension GL_EXT_scalar_block_layout : require );
2106 GLSLC(0, #extension GL_EXT_shader_explicit_arithmetic_types : require );
2107 GLSLC(0, #extension GL_EXT_control_flow_attributes : require );
2108 GLSLC(0, #extension GL_EXT_shader_image_load_formatted : require );
2110 GLSLC(0, #extension GL_EXT_expect_assume : require );
2112 GLSLC(0, #define assumeEXT(x) (x) );
2113 GLSLC(0, #define expectEXT(x,
c) (x) );
2117 GLSLC(0, #extension GL_EXT_debug_printf : require );
2121 if (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
2122 stage == VK_SHADER_STAGE_MESH_BIT_EXT)
2123 GLSLC(0, #extension GL_EXT_mesh_shader : require );
2125 for (
int i = 0;
i < nb_extensions;
i++)
2126 GLSLF(0, #extension %
s : %
s ,extensions[
i],
"require");
2129 GLSLF(0,
layout (local_size_x = %
i, local_size_y = %
i, local_size_z = %
i) in;
2139 const char *p = shd->
src.str;
2140 const char *start = p;
2141 const size_t len = strlen(p);
2146 for (
int i = 0;
i <
len;
i++) {
2162 VkPipelineLayoutCreateInfo pipeline_layout_info;
2165 pipeline_layout_info = (VkPipelineLayoutCreateInfo) {
2166 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
2173 ret = vk->CreatePipelineLayout(
s->hwctx->act_dev, &pipeline_layout_info,
2175 if (
ret != VK_SUCCESS) {
2185 VkShaderModule *
mod,
2186 uint8_t *spirv,
size_t spirv_len)
2191 VkShaderModuleCreateInfo shader_module_info = {
2192 .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
2195 .pCode = (
void *)spirv,
2196 .codeSize = spirv_len,
2199 ret = vk->CreateShaderModule(
s->hwctx->act_dev, &shader_module_info,
2200 s->hwctx->alloc,
mod);
2201 if (
ret != VK_SUCCESS) {
2211 VkShaderModule
mod,
const char *entrypoint)
2216 VkComputePipelineCreateInfo pipeline_create_info = {
2217 .sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
2219 VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT : 0x0,
2221 .stage = (VkPipelineShaderStageCreateInfo) {
2222 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
2225 .pName = entrypoint,
2227 VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT : 0x0,
2228 .stage = shd->
stage,
2233 ret = vk->CreateComputePipelines(
s->hwctx->act_dev, VK_NULL_HANDLE, 1,
2234 &pipeline_create_info,
2236 if (
ret != VK_SUCCESS) {
2246 uint8_t *spirv,
size_t spirv_len,
2247 const char *entrypoint)
2251 size_t shader_size = 0;
2253 VkShaderCreateInfoEXT shader_obj_create = {
2254 .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
2256 VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT : 0x0,
2257 .stage = shd->
stage,
2259 .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
2261 .codeSize = spirv_len,
2262 .pName = entrypoint,
2267 .pSpecializationInfo =
NULL,
2270 ret = vk->CreateShadersEXT(
s->hwctx->act_dev, 1, &shader_obj_create,
2271 s->hwctx->alloc, &shd->
object);
2272 if (
ret != VK_SUCCESS) {
2278 if (vk->GetShaderBinaryDataEXT(
s->hwctx->act_dev, shd->
object,
2279 &shader_size,
NULL) == VK_SUCCESS)
2281 shd->
name, shader_size, spirv_len);
2297 int has_singular = 0;
2298 int max_descriptors = 0;
2305 (max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
2307 (has_singular == 0);
2312 VkDescriptorSetLayoutCreateInfo desc_layout_create = {
2313 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
2314 .bindingCount =
set->nb_bindings,
2315 .pBindings =
set->binding,
2317 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT :
2319 VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR :
2323 ret = vk->CreateDescriptorSetLayout(
s->hwctx->act_dev,
2324 &desc_layout_create,
2327 if (
ret != VK_SUCCESS) {
2334 vk->GetDescriptorSetLayoutSizeEXT(
s->hwctx->act_dev, shd->
desc_layout[
i],
2338 s->desc_buf_props.descriptorBufferOffsetAlignment);
2340 for (
int j = 0; j <
set->nb_bindings; j++)
2341 vk->GetDescriptorSetLayoutBindingOffsetEXT(
s->hwctx->act_dev,
2344 &
set->binding_offset[j]);
2352 uint8_t *spirv,
size_t spirv_len,
2353 const char *entrypoint)
2387 case VK_PIPELINE_BIND_POINT_COMPUTE:
2397 vk->DestroyShaderModule(
s->hwctx->act_dev,
mod,
s->hwctx->alloc);
2413 [VK_DESCRIPTOR_TYPE_SAMPLER] = {
sizeof(VkDescriptorImageInfo),
"sampler", 1, 0, 0, 0, },
2414 [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] = {
sizeof(VkDescriptorImageInfo),
"texture", 1, 0, 1, 0, },
2415 [VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] = {
sizeof(VkDescriptorImageInfo),
"image", 1, 1, 1, 0, },
2416 [VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT] = {
sizeof(VkDescriptorImageInfo),
"subpassInput", 1, 0, 0, 0, },
2417 [VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] = {
sizeof(VkDescriptorImageInfo),
"sampler", 1, 0, 1, 0, },
2418 [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER] = {
sizeof(VkDescriptorBufferInfo),
NULL, 1, 0, 0, 1, },
2419 [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] = {
sizeof(VkDescriptorBufferInfo),
"buffer", 0, 1, 0, 1, },
2420 [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] = {
sizeof(VkDescriptorBufferInfo),
NULL, 1, 0, 0, 1, },
2421 [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] = {
sizeof(VkDescriptorBufferInfo),
"buffer", 0, 1, 0, 1, },
2422 [VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER] = {
sizeof(VkBufferView),
"samplerBuffer", 1, 0, 0, 0, },
2423 [VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER] = {
sizeof(VkBufferView),
"imageBuffer", 1, 0, 0, 0, },
2428 int singular,
int print_to_shader_only)
2430 int has_sampler = 0;
2433 if (print_to_shader_only)
2445 memset(
set, 0,
sizeof(*
set));
2452 if (!
set->binding_offset) {
2457 for (
int i = 0;
i < nb;
i++) {
2458 set->binding[
i].binding =
i;
2459 set->binding[
i].descriptorType =
desc[
i].type;
2461 set->binding[
i].stageFlags =
desc[
i].stages;
2462 set->binding[
i].pImmutableSamplers =
desc[
i].samplers;
2464 if (
desc[
i].
type == VK_DESCRIPTOR_TYPE_SAMPLER ||
2465 desc[
i].
type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
2469 set->usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
2470 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
2472 set->usage |= VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT;
2475 for (
int i = 0;
i < nb;
i++) {
2477 VkDescriptorPoolSize *desc_pool_size;
2483 sizeof(*desc_pool_size),
2485 if (!desc_pool_size)
2490 memset(&desc_pool_size[j], 0,
sizeof(VkDescriptorPoolSize));
2497 set->singular = singular;
2498 set->nb_bindings = nb;
2503 for (
int i = 0;
i < nb;
i++) {
2507 if (
desc[
i].mem_layout &&
2508 (
desc[
i].
type != VK_DESCRIPTOR_TYPE_STORAGE_IMAGE))
2521 if (
desc[
i].
type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
2522 if (
desc[
i].mem_layout) {
2523 int len = strlen(
desc[
i].mem_layout);
2524 if (
desc[
i].mem_layout[
len - 1] ==
'i' &&
2525 desc[
i].mem_layout[
len - 2] ==
'u') {
2527 }
else if (
desc[
i].mem_layout[
len - 1] ==
'i') {
2542 if (
desc[
i].buf_elems) {
2549 }
else if (
desc[
i].elems > 0) {
2578 memset(sd, 0,
sizeof(*sd));
2598 set->aligned_size*nb,
2600 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
2601 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
2602 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2610 sd->
desc_bind[
i] = (VkDescriptorBufferBindingInfoEXT) {
2611 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,
2612 .usage =
set->usage,
2619 VkDescriptorSetLayout *tmp_layouts;
2620 VkDescriptorSetAllocateInfo set_alloc_info;
2621 VkDescriptorPoolCreateInfo pool_create_info;
2626 pool_create_info = (VkDescriptorPoolCreateInfo) {
2627 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
2634 ret = vk->CreateDescriptorPool(
s->hwctx->act_dev, &pool_create_info,
2636 if (
ret != VK_SUCCESS) {
2642 tmp_layouts =
av_malloc_array(pool_create_info.maxSets,
sizeof(*tmp_layouts));
2651 set_alloc_info = (VkDescriptorSetAllocateInfo) {
2652 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
2654 .pSetLayouts = tmp_layouts,
2655 .descriptorSetCount = pool_create_info.maxSets,
2659 sizeof(*tmp_layouts));
2664 ret = vk->AllocateDescriptorSets(
s->hwctx->act_dev, &set_alloc_info,
2667 if (
ret != VK_SUCCESS) {
2689 int bind_idx,
int array_idx,
2690 VkDescriptorGetInfoEXT *desc_get_info,
2701 array_idx*desc_size;
2703 vk->GetDescriptorEXT(
s->hwctx->act_dev, desc_get_info, desc_size,
desc);
2708 VkWriteDescriptorSet *write_info)
2717 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2721 vk->CmdPushDescriptorSetKHR(e->
buf,
2728 vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0,
NULL);
2735 VkImageView view, VkImageLayout
layout,
2741 VkDescriptorGetInfoEXT desc_get_info = {
2742 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
2743 .type = desc_set->
binding[bind].descriptorType,
2745 VkDescriptorImageInfo desc_img_info = {
2752 switch (desc_get_info.type) {
2753 case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
2754 desc_get_info.
data.pSampledImage = &desc_img_info;
2755 desc_size =
s->desc_buf_props.sampledImageDescriptorSize;
2757 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
2758 desc_get_info.data.pStorageImage = &desc_img_info;
2759 desc_size =
s->desc_buf_props.storageImageDescriptorSize;
2761 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
2762 desc_get_info.data.pInputAttachmentImage = &desc_img_info;
2763 desc_size =
s->desc_buf_props.inputAttachmentDescriptorSize;
2765 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
2766 desc_get_info.data.pCombinedImageSampler = &desc_img_info;
2767 desc_size =
s->desc_buf_props.combinedImageSamplerDescriptorSize;
2771 set, bind, desc_get_info.type);
2777 &desc_get_info, desc_size);
2779 VkDescriptorImageInfo desc_pool_write_info_img = {
2784 VkWriteDescriptorSet desc_pool_write_info = {
2785 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2787 .descriptorCount = 1,
2788 .dstArrayElement = offs,
2789 .descriptorType = desc_set->
binding[bind].descriptorType,
2790 .pImageInfo = &desc_pool_write_info_img,
2800 VkImageView *views,
int set,
int binding,
2801 VkImageLayout
layout, VkSampler sampler)
2806 for (
int i = 0;
i < nb_planes;
i++)
2813 int set,
int bind,
int elem,
2820 VkDescriptorGetInfoEXT desc_get_info = {
2821 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
2822 .type = desc_set->
binding[bind].descriptorType,
2824 VkDescriptorAddressInfoEXT desc_buf_info = {
2825 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
2832 switch (desc_get_info.type) {
2833 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
2834 desc_get_info.data.pUniformBuffer = &desc_buf_info;
2835 desc_size =
s->desc_buf_props.uniformBufferDescriptorSize;
2837 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
2838 desc_get_info.data.pStorageBuffer = &desc_buf_info;
2839 desc_size =
s->desc_buf_props.storageBufferDescriptorSize;
2841 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
2842 desc_get_info.data.pUniformTexelBuffer = &desc_buf_info;
2843 desc_size =
s->desc_buf_props.uniformTexelBufferDescriptorSize;
2845 case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
2846 desc_get_info.data.pStorageTexelBuffer = &desc_buf_info;
2847 desc_size =
s->desc_buf_props.storageTexelBufferDescriptorSize;
2851 set, bind, desc_get_info.type);
2858 VkDescriptorBufferInfo desc_pool_write_info_buf = {
2863 VkWriteDescriptorSet desc_pool_write_info = {
2864 .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
2866 .descriptorCount = 1,
2867 .dstArrayElement = elem,
2868 .descriptorType = desc_set->
binding[bind].descriptorType,
2869 .pBufferInfo = &desc_pool_write_info_buf,
2879 VkShaderStageFlagBits stage,
2895 VkShaderStageFlagBits stages = shd->
stage;
2896 vk->CmdBindShadersEXT(e->
buf, 1, &stages, &shd->
object);
2928 if (shd->shader.module)
2929 vk->DestroyShaderModule(
s->hwctx->act_dev, shd->shader.module,
2934 vk->DestroyShaderEXT(
s->hwctx->act_dev, shd->
object,
s->hwctx->alloc);
2936 vk->DestroyPipeline(
s->hwctx->act_dev, shd->
pipeline,
s->hwctx->alloc);
2950 vk->DestroyDescriptorSetLayout(
s->hwctx->act_dev, shd->
desc_layout[
i],
2979 static const AVClass vulkan_context_class = {
2985 memset(
s, 0,
sizeof(*
s));
2986 s->log_parent = log_parent;
2987 s->class = &vulkan_context_class;
2995 s->hwfc =
s->frames->hwctx;
2997 device_ref =
s->frames->device_ref;
3001 if (!
s->device_ref) {
3007 s->hwctx =
s->device->hwctx;
3010 s->hwctx->nb_enabled_dev_extensions);
3012 s->hwctx->nb_enabled_inst_extensions);