mirror of
https://mirror.skon.top/https://github.com/FFmpeg/FFmpeg
synced 2026-04-20 12:50:49 +08:00
vulkan: drop support for descriptor buffers
Descriptor buffers were a neat attempt at organizing descriptors. Simple, robust, reliable. Unfortunately, driver support never caught on, and neither did validation layer support. Now they're being replaced by descriptor heaps, which promises to be the future. We'll see how it goes.
This commit is contained in:
@@ -85,7 +85,6 @@ static int init_state_transition_data(FFVulkanContext *s,
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
@@ -116,7 +115,6 @@ int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s,
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
@@ -142,7 +140,6 @@ int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
|
||||
@@ -229,8 +229,7 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx,
|
||||
if (!slice_data_ref) {
|
||||
RET(ff_vk_get_pooled_buffer(&fv->s, &fv->slice_data_pool,
|
||||
&slice_data_ref,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, slice_state_size*f->slice_count,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
|
||||
|
||||
@@ -243,8 +242,7 @@ static int vulkan_encode_ffv1_submit_frame(AVCodecContext *avctx,
|
||||
/* Allocate results buffer */
|
||||
RET(ff_vk_get_pooled_buffer(&fv->s, &fv->results_data_pool,
|
||||
&fd->results_data_ref,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, 2*f->slice_count*sizeof(uint64_t),
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
|
||||
@@ -72,8 +72,7 @@ static int vk_dpx_start_frame(AVCodecContext *avctx,
|
||||
ctx->s.extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY)
|
||||
ff_vk_host_map_buffer(&ctx->s, &vp->slices_buf, (uint8_t *)buffer,
|
||||
buffer_ref,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT);
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
||||
|
||||
/* Prepare frame to be used */
|
||||
err = ff_vk_decode_prepare_frame_sdr(dec, dpx->frame, vp, 1,
|
||||
|
||||
@@ -138,8 +138,7 @@ static int vk_ffv1_start_frame(AVCodecContext *avctx,
|
||||
if (f->picture.f->flags & AV_FRAME_FLAG_KEY) {
|
||||
err = ff_vk_get_pooled_buffer(&ctx->s, &fv->slice_state_pool,
|
||||
&fp->slice_state,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, f->slice_count*fp->slice_state_size,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
if (err < 0)
|
||||
@@ -154,8 +153,7 @@ static int vk_ffv1_start_frame(AVCodecContext *avctx,
|
||||
/* Allocate slice offsets buffer */
|
||||
err = ff_vk_get_pooled_buffer(&ctx->s, &fv->slice_offset_pool,
|
||||
&fp->slice_offset_buf,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, 2*f->slice_count*sizeof(uint32_t),
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
|
||||
@@ -165,8 +163,7 @@ static int vk_ffv1_start_frame(AVCodecContext *avctx,
|
||||
/* Allocate slice status buffer */
|
||||
err = ff_vk_get_pooled_buffer(&ctx->s, &fv->slice_status_pool,
|
||||
&fp->slice_status_buf,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, 2*f->slice_count*sizeof(uint32_t),
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
|
||||
|
||||
@@ -85,8 +85,7 @@ static int vk_prores_raw_start_frame(AVCodecContext *avctx,
|
||||
/* Allocate tile data */
|
||||
err = ff_vk_get_pooled_buffer(&ctx->s, &prv->frame_data_pool,
|
||||
&pp->frame_data_buf,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
NULL, prr->nb_tiles*sizeof(TileData),
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
|
||||
|
||||
@@ -668,7 +668,6 @@ static av_cold int init_filter(AVFilterContext *ctx)
|
||||
}
|
||||
|
||||
RET(ff_vk_create_buf(&s->vkctx, &s->xyoffsets_buf, 2*s->nb_offsets*sizeof(int32_t), NULL, NULL,
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
|
||||
@@ -861,8 +860,7 @@ static int nlmeans_vulkan_filter_frame(AVFilterLink *link, AVFrame *in)
|
||||
|
||||
err = ff_vk_get_pooled_buffer(&s->vkctx, &s->ws_buf_pool, &ws_buf,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_TRANSFER_DST_BIT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
|
||||
VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
||||
NULL,
|
||||
ws_size * s-> opts.t * 2,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
|
||||
@@ -112,7 +112,6 @@ typedef struct VulkanDeviceFeatures {
|
||||
|
||||
VkPhysicalDeviceShaderObjectFeaturesEXT shader_object;
|
||||
VkPhysicalDeviceCooperativeMatrixFeaturesKHR cooperative_matrix;
|
||||
VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptor_buffer;
|
||||
VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomic_float;
|
||||
|
||||
#ifdef VK_KHR_shader_relaxed_extended_instruction
|
||||
@@ -274,8 +273,6 @@ static void device_features_init(AVHWDeviceContext *ctx, VulkanDeviceFeatures *f
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
|
||||
FF_VK_STRUCT_EXT(s, &feats->device, &feats->cooperative_matrix, FF_VK_EXT_COOP_MATRIX,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
|
||||
FF_VK_STRUCT_EXT(s, &feats->device, &feats->descriptor_buffer, FF_VK_EXT_DESCRIPTOR_BUFFER,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
|
||||
FF_VK_STRUCT_EXT(s, &feats->device, &feats->atomic_float, FF_VK_EXT_ATOMIC_FLOAT,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
|
||||
FF_VK_STRUCT_EXT(s, &feats->device, &feats->explicit_mem_layout, FF_VK_EXT_EXPLICIT_MEM_LAYOUT,
|
||||
@@ -374,9 +371,6 @@ static void device_features_copy_needed(VulkanDeviceFeatures *dst, VulkanDeviceF
|
||||
|
||||
COPY_VAL(cooperative_matrix.cooperativeMatrix);
|
||||
|
||||
COPY_VAL(descriptor_buffer.descriptorBuffer);
|
||||
COPY_VAL(descriptor_buffer.descriptorBufferPushDescriptors);
|
||||
|
||||
COPY_VAL(atomic_float.shaderBufferFloat32Atomics);
|
||||
COPY_VAL(atomic_float.shaderBufferFloat32AtomicAdd);
|
||||
|
||||
@@ -687,7 +681,6 @@ static const VulkanOptExtension optional_device_exts[] = {
|
||||
/* Misc or required by other extensions */
|
||||
{ VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME, FF_VK_EXT_PORTABILITY_SUBSET },
|
||||
{ VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, FF_VK_EXT_PUSH_DESCRIPTOR },
|
||||
{ VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER },
|
||||
{ VK_EXT_PHYSICAL_DEVICE_DRM_EXTENSION_NAME, FF_VK_EXT_DEVICE_DRM },
|
||||
{ VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, FF_VK_EXT_ATOMIC_FLOAT },
|
||||
{ VK_KHR_COOPERATIVE_MATRIX_EXTENSION_NAME, FF_VK_EXT_COOP_MATRIX },
|
||||
@@ -918,11 +911,6 @@ static int check_extensions(AVHWDeviceContext *ctx, int dev, AVDictionary *opts,
|
||||
tstr = optional_exts[i].name;
|
||||
found = 0;
|
||||
|
||||
/* Intel has had a bad descriptor buffer implementation for a while */
|
||||
if (p->dprops.driverID == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA &&
|
||||
!strcmp(tstr, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME))
|
||||
continue;
|
||||
|
||||
/* Check if the device has ReBAR for host image copies */
|
||||
if (!strcmp(tstr, VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME) &&
|
||||
!vulkan_device_has_rebar(ctx))
|
||||
@@ -932,8 +920,7 @@ static int check_extensions(AVHWDeviceContext *ctx, int dev, AVDictionary *opts,
|
||||
((debug_mode == FF_VULKAN_DEBUG_VALIDATE) ||
|
||||
(debug_mode == FF_VULKAN_DEBUG_PRINTF) ||
|
||||
(debug_mode == FF_VULKAN_DEBUG_PRACTICES)) &&
|
||||
(!strcmp(tstr, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME) ||
|
||||
!strcmp(tstr, VK_EXT_SHADER_OBJECT_EXTENSION_NAME))) {
|
||||
(!strcmp(tstr, VK_EXT_SHADER_OBJECT_EXTENSION_NAME))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -165,8 +165,6 @@ int ff_vk_load_props(FFVulkanContext *s)
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
|
||||
FF_VK_STRUCT_EXT(s, &s->props, &s->coop_matrix_props, FF_VK_EXT_COOP_MATRIX,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
|
||||
FF_VK_STRUCT_EXT(s, &s->props, &s->desc_buf_props, FF_VK_EXT_DESCRIPTOR_BUFFER,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT);
|
||||
FF_VK_STRUCT_EXT(s, &s->props, &s->optical_flow_props, FF_VK_EXT_OPTICAL_FLOW,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
|
||||
FF_VK_STRUCT_EXT(s, &s->props, &s->host_image_props, FF_VK_EXT_HOST_IMAGE_COPY,
|
||||
@@ -330,15 +328,6 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool)
|
||||
for (int i = 0; i < pool->nb_reg_shd; i++) {
|
||||
FFVulkanShaderData *sd = &pool->reg_shd[i];
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
for (int j = 0; j < sd->nb_descriptor_sets; j++) {
|
||||
FFVulkanDescriptorSetData *set_data = &sd->desc_set_buf[j];
|
||||
if (set_data->buf.mem)
|
||||
ff_vk_unmap_buffer(s, &set_data->buf, 0);
|
||||
ff_vk_free_buf(s, &set_data->buf);
|
||||
}
|
||||
}
|
||||
|
||||
if (sd->desc_pool)
|
||||
vk->DestroyDescriptorPool(s->hwctx->act_dev, sd->desc_pool,
|
||||
s->hwctx->alloc);
|
||||
@@ -1037,16 +1026,6 @@ int ff_vk_create_buf(FFVulkanContext *s, FFVkBuffer *buf, size_t size,
|
||||
int use_ded_mem;
|
||||
FFVulkanFunctions *vk = &s->vkfn;
|
||||
|
||||
/* Buffer usage flags corresponding to buffer descriptor types */
|
||||
const VkBufferUsageFlags desc_usage =
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
|
||||
|
||||
if ((s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) && (usage & desc_usage))
|
||||
usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
|
||||
|
||||
VkBufferCreateInfo buf_spawn = {
|
||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||
.pNext = pNext,
|
||||
@@ -2263,8 +2242,7 @@ static int init_compute_pipeline(FFVulkanContext *s, FFVulkanShader *shd,
|
||||
|
||||
VkComputePipelineCreateInfo pipeline_create_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
|
||||
.flags = (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) ?
|
||||
VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT : 0x0,
|
||||
.flags = 0x0,
|
||||
.layout = shd->pipeline_layout,
|
||||
.stage = (VkPipelineShaderStageCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
|
||||
@@ -2335,19 +2313,17 @@ static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd)
|
||||
VkResult ret;
|
||||
FFVulkanFunctions *vk = &s->vkfn;
|
||||
|
||||
if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER)) {
|
||||
int has_singular = 0;
|
||||
int max_descriptors = 0;
|
||||
for (int i = 0; i < shd->nb_descriptor_sets; i++) {
|
||||
max_descriptors = FFMAX(max_descriptors, shd->desc_set[i].nb_bindings);
|
||||
if (shd->desc_set[i].singular)
|
||||
has_singular = 1;
|
||||
}
|
||||
shd->use_push = (s->extensions & FF_VK_EXT_PUSH_DESCRIPTOR) &&
|
||||
(max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
|
||||
(shd->nb_descriptor_sets == 1) &&
|
||||
(has_singular == 0);
|
||||
int has_singular = 0;
|
||||
int max_descriptors = 0;
|
||||
for (int i = 0; i < shd->nb_descriptor_sets; i++) {
|
||||
max_descriptors = FFMAX(max_descriptors, shd->desc_set[i].nb_bindings);
|
||||
if (shd->desc_set[i].singular)
|
||||
has_singular = 1;
|
||||
}
|
||||
shd->use_push = (s->extensions & FF_VK_EXT_PUSH_DESCRIPTOR) &&
|
||||
(max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
|
||||
(shd->nb_descriptor_sets == 1) &&
|
||||
(has_singular == 0);
|
||||
|
||||
for (int i = 0; i < shd->nb_descriptor_sets; i++) {
|
||||
FFVulkanDescriptorSet *set = &shd->desc_set[i];
|
||||
@@ -2355,9 +2331,7 @@ static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd)
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
|
||||
.bindingCount = set->nb_bindings,
|
||||
.pBindings = set->binding,
|
||||
.flags = (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) ?
|
||||
VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT :
|
||||
(shd->use_push) ?
|
||||
.flags = (shd->use_push) ?
|
||||
VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR :
|
||||
0x0,
|
||||
};
|
||||
@@ -2371,20 +2345,6 @@ static int init_descriptors(FFVulkanContext *s, FFVulkanShader *shd)
|
||||
ff_vk_ret2str(ret));
|
||||
return AVERROR_EXTERNAL;
|
||||
}
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
vk->GetDescriptorSetLayoutSizeEXT(s->hwctx->act_dev, shd->desc_layout[i],
|
||||
&set->layout_size);
|
||||
|
||||
set->aligned_size = FFALIGN(set->layout_size,
|
||||
s->desc_buf_props.descriptorBufferOffsetAlignment);
|
||||
|
||||
for (int j = 0; j < set->nb_bindings; j++)
|
||||
vk->GetDescriptorSetLayoutBindingOffsetEXT(s->hwctx->act_dev,
|
||||
shd->desc_layout[i],
|
||||
j,
|
||||
&set->binding_offset[j]);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -2444,11 +2404,6 @@ int ff_vk_shader_link(FFVulkanContext *s, FFVulkanShader *shd,
|
||||
if (err < 0)
|
||||
goto end;
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
for (int i = 0; i < shd->nb_descriptor_sets; i++)
|
||||
shd->bound_buffer_indices[i] = i;
|
||||
}
|
||||
|
||||
if (s->extensions & FF_VK_EXT_SHADER_OBJECT) {
|
||||
err = create_shader_object(s, shd, spirv, spirv_len,
|
||||
&binary_size, entrypoint);
|
||||
@@ -2526,8 +2481,6 @@ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd,
|
||||
const FFVulkanDescriptorSetBinding *desc, int nb,
|
||||
int singular, int print_to_shader_only)
|
||||
{
|
||||
int has_sampler = 0;
|
||||
|
||||
if (print_to_shader_only)
|
||||
goto print;
|
||||
|
||||
@@ -2541,30 +2494,20 @@ int ff_vk_shader_add_descriptor_set(FFVulkanContext *s, FFVulkanShader *shd,
|
||||
set->binding[i].descriptorCount = FFMAX(desc[i].elems, 1);
|
||||
set->binding[i].stageFlags = desc[i].stages;
|
||||
set->binding[i].pImmutableSamplers = desc[i].samplers;
|
||||
|
||||
if (desc[i].type == VK_DESCRIPTOR_TYPE_SAMPLER ||
|
||||
desc[i].type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
|
||||
has_sampler |= 1;
|
||||
}
|
||||
|
||||
set->usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
|
||||
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
|
||||
if (has_sampler)
|
||||
set->usage |= VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT;
|
||||
|
||||
if (!(s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER)) {
|
||||
for (int i = 0; i < nb; i++) {
|
||||
int j;
|
||||
for (j = 0; j < shd->nb_desc_pool_size; j++)
|
||||
if (shd->desc_pool_size[j].type == desc[i].type)
|
||||
break;
|
||||
if (j >= shd->nb_desc_pool_size) {
|
||||
shd->nb_desc_pool_size++;
|
||||
av_assert1(shd->nb_desc_pool_size < FF_VK_MAX_DESCRIPTOR_TYPES);
|
||||
}
|
||||
shd->desc_pool_size[j].type = desc[i].type;
|
||||
shd->desc_pool_size[j].descriptorCount += FFMAX(desc[i].elems, 1);
|
||||
for (int i = 0; i < nb; i++) {
|
||||
int j;
|
||||
for (j = 0; j < shd->nb_desc_pool_size; j++)
|
||||
if (shd->desc_pool_size[j].type == desc[i].type)
|
||||
break;
|
||||
if (j >= shd->nb_desc_pool_size) {
|
||||
shd->nb_desc_pool_size++;
|
||||
av_assert1(shd->nb_desc_pool_size < FF_VK_MAX_DESCRIPTOR_TYPES);
|
||||
}
|
||||
|
||||
shd->desc_pool_size[j].type = desc[i].type;
|
||||
shd->desc_pool_size[j].descriptorCount += FFMAX(desc[i].elems, 1);
|
||||
}
|
||||
|
||||
set->singular = singular;
|
||||
@@ -2637,8 +2580,6 @@ print:
|
||||
int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool,
|
||||
FFVulkanShader *shd)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!shd->nb_descriptor_sets)
|
||||
return 0;
|
||||
|
||||
@@ -2648,32 +2589,7 @@ int ff_vk_shader_register_exec(FFVulkanContext *s, FFVkExecPool *pool,
|
||||
sd->shd = shd;
|
||||
sd->nb_descriptor_sets = shd->nb_descriptor_sets;
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
for (int i = 0; i < sd->nb_descriptor_sets; i++) {
|
||||
FFVulkanDescriptorSet *set = &shd->desc_set[i];
|
||||
FFVulkanDescriptorSetData *sdb = &sd->desc_set_buf[i];
|
||||
int nb = set->singular ? 1 : pool->pool_size;
|
||||
|
||||
err = ff_vk_create_buf(s, &sdb->buf,
|
||||
set->aligned_size*nb,
|
||||
NULL, NULL, set->usage,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = ff_vk_map_buffer(s, &sdb->buf, &sdb->desc_mem, 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
sd->desc_bind[i] = (VkDescriptorBufferBindingInfoEXT) {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,
|
||||
.usage = set->usage,
|
||||
.address = sdb->buf.address,
|
||||
};
|
||||
}
|
||||
} else if (!shd->use_push) {
|
||||
if (!shd->use_push) {
|
||||
VkResult ret;
|
||||
FFVulkanFunctions *vk = &s->vkfn;
|
||||
VkDescriptorSetLayout *tmp_layouts;
|
||||
@@ -2744,25 +2660,6 @@ static inline const FFVulkanShaderData *get_shd_data(FFVkExecContext *e,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void update_set_descriptor(FFVulkanContext *s, FFVkExecContext *e,
|
||||
FFVulkanShader *shd, int set,
|
||||
int bind_idx, int array_idx,
|
||||
VkDescriptorGetInfoEXT *desc_get_info,
|
||||
size_t desc_size)
|
||||
{
|
||||
FFVulkanFunctions *vk = &s->vkfn;
|
||||
FFVulkanDescriptorSet *desc_set = &shd->desc_set[set];
|
||||
const FFVulkanShaderData *sd = get_shd_data(e, shd);
|
||||
const size_t exec_offset = desc_set->singular ? 0 : desc_set->aligned_size*e->idx;
|
||||
|
||||
void *desc = sd->desc_set_buf[set].desc_mem + /* Base */
|
||||
exec_offset + /* Execution context */
|
||||
desc_set->binding_offset[bind_idx] + /* Descriptor binding */
|
||||
array_idx*desc_size; /* Array position */
|
||||
|
||||
vk->GetDescriptorEXT(s->hwctx->act_dev, desc_get_info, desc_size, desc);
|
||||
}
|
||||
|
||||
static inline void update_set_pool_write(FFVulkanContext *s, FFVkExecContext *e,
|
||||
FFVulkanShader *shd, int set,
|
||||
VkWriteDescriptorSet *write_info)
|
||||
@@ -2797,60 +2694,20 @@ int ff_vk_shader_update_img(FFVulkanContext *s, FFVkExecContext *e,
|
||||
{
|
||||
FFVulkanDescriptorSet *desc_set = &shd->desc_set[set];
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
VkDescriptorGetInfoEXT desc_get_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
|
||||
.type = desc_set->binding[bind].descriptorType,
|
||||
};
|
||||
VkDescriptorImageInfo desc_img_info = {
|
||||
.imageView = view,
|
||||
.sampler = sampler,
|
||||
.imageLayout = layout,
|
||||
};
|
||||
size_t desc_size;
|
||||
|
||||
switch (desc_get_info.type) {
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
|
||||
desc_get_info.data.pSampledImage = &desc_img_info;
|
||||
desc_size = s->desc_buf_props.sampledImageDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
||||
desc_get_info.data.pStorageImage = &desc_img_info;
|
||||
desc_size = s->desc_buf_props.storageImageDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
|
||||
desc_get_info.data.pInputAttachmentImage = &desc_img_info;
|
||||
desc_size = s->desc_buf_props.inputAttachmentDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||
desc_get_info.data.pCombinedImageSampler = &desc_img_info;
|
||||
desc_size = s->desc_buf_props.combinedImageSamplerDescriptorSize;
|
||||
break;
|
||||
default:
|
||||
av_log(s, AV_LOG_ERROR, "Invalid descriptor type at set %i binding %i: %i!\n",
|
||||
set, bind, desc_get_info.type);
|
||||
return AVERROR(EINVAL);
|
||||
break;
|
||||
};
|
||||
|
||||
update_set_descriptor(s, e, shd, set, bind, offs,
|
||||
&desc_get_info, desc_size);
|
||||
} else {
|
||||
VkDescriptorImageInfo desc_pool_write_info_img = {
|
||||
.sampler = sampler,
|
||||
.imageView = view,
|
||||
.imageLayout = layout,
|
||||
};
|
||||
VkWriteDescriptorSet desc_pool_write_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstBinding = bind,
|
||||
.descriptorCount = 1,
|
||||
.dstArrayElement = offs,
|
||||
.descriptorType = desc_set->binding[bind].descriptorType,
|
||||
.pImageInfo = &desc_pool_write_info_img,
|
||||
};
|
||||
update_set_pool_write(s, e, shd, set, &desc_pool_write_info);
|
||||
}
|
||||
VkDescriptorImageInfo desc_pool_write_info_img = {
|
||||
.sampler = sampler,
|
||||
.imageView = view,
|
||||
.imageLayout = layout,
|
||||
};
|
||||
VkWriteDescriptorSet desc_pool_write_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstBinding = bind,
|
||||
.descriptorCount = 1,
|
||||
.dstArrayElement = offs,
|
||||
.descriptorType = desc_set->binding[bind].descriptorType,
|
||||
.pImageInfo = &desc_pool_write_info_img,
|
||||
};
|
||||
update_set_pool_write(s, e, shd, set, &desc_pool_write_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2876,60 +2733,20 @@ int ff_vk_shader_update_desc_buffer(FFVulkanContext *s, FFVkExecContext *e,
|
||||
{
|
||||
FFVulkanDescriptorSet *desc_set = &shd->desc_set[set];
|
||||
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
VkDescriptorGetInfoEXT desc_get_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
|
||||
.type = desc_set->binding[bind].descriptorType,
|
||||
};
|
||||
VkDescriptorAddressInfoEXT desc_buf_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
|
||||
.address = buf->address + offset,
|
||||
.range = len,
|
||||
.format = fmt,
|
||||
};
|
||||
size_t desc_size;
|
||||
|
||||
switch (desc_get_info.type) {
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
desc_get_info.data.pUniformBuffer = &desc_buf_info;
|
||||
desc_size = s->desc_buf_props.uniformBufferDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
desc_get_info.data.pStorageBuffer = &desc_buf_info;
|
||||
desc_size = s->desc_buf_props.storageBufferDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||
desc_get_info.data.pUniformTexelBuffer = &desc_buf_info;
|
||||
desc_size = s->desc_buf_props.uniformTexelBufferDescriptorSize;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||
desc_get_info.data.pStorageTexelBuffer = &desc_buf_info;
|
||||
desc_size = s->desc_buf_props.storageTexelBufferDescriptorSize;
|
||||
break;
|
||||
default:
|
||||
av_log(s, AV_LOG_ERROR, "Invalid descriptor type at set %i binding %i: %i!\n",
|
||||
set, bind, desc_get_info.type);
|
||||
return AVERROR(EINVAL);
|
||||
break;
|
||||
};
|
||||
|
||||
update_set_descriptor(s, e, shd, set, bind, elem, &desc_get_info, desc_size);
|
||||
} else {
|
||||
VkDescriptorBufferInfo desc_pool_write_info_buf = {
|
||||
.buffer = buf->buf,
|
||||
.offset = buf->virtual_offset + offset,
|
||||
.range = len,
|
||||
};
|
||||
VkWriteDescriptorSet desc_pool_write_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstBinding = bind,
|
||||
.descriptorCount = 1,
|
||||
.dstArrayElement = elem,
|
||||
.descriptorType = desc_set->binding[bind].descriptorType,
|
||||
.pBufferInfo = &desc_pool_write_info_buf,
|
||||
};
|
||||
update_set_pool_write(s, e, shd, set, &desc_pool_write_info);
|
||||
}
|
||||
VkDescriptorBufferInfo desc_pool_write_info_buf = {
|
||||
.buffer = buf->buf,
|
||||
.offset = buf->virtual_offset + offset,
|
||||
.range = len,
|
||||
};
|
||||
VkWriteDescriptorSet desc_pool_write_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
|
||||
.dstBinding = bind,
|
||||
.descriptorCount = 1,
|
||||
.dstArrayElement = elem,
|
||||
.descriptorType = desc_set->binding[bind].descriptorType,
|
||||
.pBufferInfo = &desc_pool_write_info_buf,
|
||||
};
|
||||
update_set_pool_write(s, e, shd, set, &desc_pool_write_info);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -2948,7 +2765,6 @@ void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e,
|
||||
FFVulkanShader *shd)
|
||||
{
|
||||
FFVulkanFunctions *vk = &s->vkfn;
|
||||
VkDeviceSize offsets[1024];
|
||||
const FFVulkanShaderData *sd = get_shd_data(e, shd);
|
||||
|
||||
if (s->extensions & FF_VK_EXT_SHADER_OBJECT) {
|
||||
@@ -2959,20 +2775,7 @@ void ff_vk_exec_bind_shader(FFVulkanContext *s, FFVkExecContext *e,
|
||||
}
|
||||
|
||||
if (sd && sd->nb_descriptor_sets) {
|
||||
if (s->extensions & FF_VK_EXT_DESCRIPTOR_BUFFER) {
|
||||
for (int i = 0; i < sd->nb_descriptor_sets; i++)
|
||||
offsets[i] = shd->desc_set[i].singular ?
|
||||
0 : shd->desc_set[i].aligned_size*e->idx;
|
||||
|
||||
/* Bind descriptor buffers */
|
||||
vk->CmdBindDescriptorBuffersEXT(e->buf, sd->nb_descriptor_sets,
|
||||
sd->desc_bind);
|
||||
/* Binding offsets */
|
||||
vk->CmdSetDescriptorBufferOffsetsEXT(e->buf, shd->bind_point,
|
||||
shd->pipeline_layout,
|
||||
0, sd->nb_descriptor_sets,
|
||||
shd->bound_buffer_indices, offsets);
|
||||
} else if (!shd->use_push) {
|
||||
if (!shd->use_push) {
|
||||
vk->CmdBindDescriptorSets(e->buf, shd->bind_point, shd->pipeline_layout,
|
||||
0, sd->nb_descriptor_sets,
|
||||
&sd->desc_sets[e->idx*sd->nb_descriptor_sets],
|
||||
|
||||
@@ -258,9 +258,8 @@ typedef struct FFVulkanShader {
|
||||
FFVulkanDescriptorSet desc_set[FF_VK_MAX_DESCRIPTOR_SETS];
|
||||
int nb_descriptor_sets;
|
||||
|
||||
/* Descriptor buffer */
|
||||
/* Descriptors */
|
||||
VkDescriptorSetLayout desc_layout[FF_VK_MAX_DESCRIPTOR_SETS];
|
||||
uint32_t bound_buffer_indices[FF_VK_MAX_DESCRIPTOR_SETS];
|
||||
|
||||
/* Descriptor pool */
|
||||
int use_push;
|
||||
|
||||
@@ -39,7 +39,6 @@ typedef uint64_t FFVulkanExtensions;
|
||||
#define FF_VK_EXT_EXTERNAL_WIN32_MEMORY (1ULL << 6) /* VK_KHR_external_memory_win32 */
|
||||
#define FF_VK_EXT_EXTERNAL_WIN32_SEM (1ULL << 7) /* VK_KHR_external_semaphore_win32 */
|
||||
|
||||
#define FF_VK_EXT_DESCRIPTOR_BUFFER (1ULL << 8) /* VK_EXT_descriptor_buffer */
|
||||
#define FF_VK_EXT_DEVICE_DRM (1ULL << 9) /* VK_EXT_physical_device_drm */
|
||||
#define FF_VK_EXT_ATOMIC_FLOAT (1ULL << 10) /* VK_EXT_shader_atomic_float */
|
||||
#define FF_VK_EXT_COOP_MATRIX (1ULL << 11) /* VK_KHR_cooperative_matrix */
|
||||
@@ -188,13 +187,6 @@ typedef uint64_t FFVulkanExtensions;
|
||||
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorPool) \
|
||||
MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorSetLayout) \
|
||||
\
|
||||
/* Descriptor buffers */ \
|
||||
MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutSizeEXT) \
|
||||
MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutBindingOffsetEXT) \
|
||||
MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorEXT) \
|
||||
MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdBindDescriptorBuffersEXT) \
|
||||
MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdSetDescriptorBufferOffsetsEXT) \
|
||||
\
|
||||
/* DescriptorUpdateTemplate */ \
|
||||
MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \
|
||||
MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \
|
||||
|
||||
@@ -78,7 +78,6 @@ static inline uint64_t ff_vk_extensions_to_mask(const char * const *extensions,
|
||||
{ VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_MEMORY },
|
||||
{ VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME, FF_VK_EXT_EXTERNAL_WIN32_SEM },
|
||||
#endif
|
||||
{ VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME, FF_VK_EXT_DESCRIPTOR_BUFFER, },
|
||||
{ VK_KHR_VIDEO_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_QUEUE },
|
||||
{ VK_KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_ENCODE_QUEUE },
|
||||
{ VK_KHR_VIDEO_DECODE_QUEUE_EXTENSION_NAME, FF_VK_EXT_VIDEO_DECODE_QUEUE },
|
||||
|
||||
Reference in New Issue
Block a user