mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-03-13 09:00:40 +08:00
vulkan/ffv1: unify all constants buffer into a single buffer
Less allocations is always better.
This commit is contained in:
@@ -55,103 +55,50 @@ void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f,
|
||||
SPEC_LIST_ADD(sl, 14, 32, f->chroma_v_shift);
|
||||
}
|
||||
|
||||
int ff_ffv1_vk_update_state_transition_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f)
|
||||
static void set_crc_tab(uint32_t *buf)
|
||||
{
|
||||
int err;
|
||||
uint8_t *buf_mapped;
|
||||
|
||||
RET(ff_vk_map_buffer(s, vkb, &buf_mapped, 0));
|
||||
|
||||
for (int i = 1; i < 256; i++) {
|
||||
buf_mapped[256 + i] = f->state_transition[i];
|
||||
buf_mapped[256 - i] = 256 - (int)f->state_transition[i];
|
||||
for (uint32_t i = 0; i < 256; i++) {
|
||||
uint32_t c = i << 24;
|
||||
for (int j = 0; j < 8; j++)
|
||||
c = (c << 1) ^ (0x04C11DB7 & (((int32_t) c) >> 31));
|
||||
buf[i] = av_bswap32(c);
|
||||
}
|
||||
|
||||
RET(ff_vk_unmap_buffer(s, vkb, 1));
|
||||
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int init_state_transition_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f,
|
||||
int (*write_data)(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f))
|
||||
static void set_rc_state_tab(FFV1Context *f, uint8_t *buf)
|
||||
{
|
||||
int err;
|
||||
size_t buf_len = 512*sizeof(uint8_t);
|
||||
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
|
||||
write_data(s, vkb, f);
|
||||
|
||||
fail:
|
||||
return err;
|
||||
for (int i = 1; i < 256; i++) {
|
||||
buf[256 + i] = f->state_transition[i];
|
||||
buf[256 - i] = 256 - (int)f->state_transition[i];
|
||||
}
|
||||
}
|
||||
|
||||
int ff_ffv1_vk_init_state_transition_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f)
|
||||
{
|
||||
return init_state_transition_data(s, vkb, f,
|
||||
ff_ffv1_vk_update_state_transition_data);
|
||||
}
|
||||
|
||||
int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f)
|
||||
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f)
|
||||
{
|
||||
int err;
|
||||
|
||||
int16_t *buf_mapped;
|
||||
size_t buf_len = MAX_QUANT_TABLES*
|
||||
uint8_t *buf_mapped;
|
||||
size_t buf_len = 256*sizeof(uint32_t) + /* CRC */
|
||||
512*sizeof(uint8_t) + /* Rangecoder */
|
||||
MAX_QUANT_TABLES*
|
||||
MAX_CONTEXT_INPUTS*
|
||||
MAX_QUANT_TABLE_SIZE*sizeof(int16_t);
|
||||
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
|
||||
|
||||
memcpy(buf_mapped, f->quant_tables,
|
||||
sizeof(f->quant_tables));
|
||||
|
||||
RET(ff_vk_unmap_buffer(s, vkb, 1));
|
||||
|
||||
fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f)
|
||||
{
|
||||
int err;
|
||||
|
||||
uint32_t *buf_mapped;
|
||||
size_t buf_len = 256*sizeof(int32_t);
|
||||
|
||||
RET(ff_vk_create_buf(s, vkb,
|
||||
buf_len,
|
||||
NULL, NULL,
|
||||
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
|
||||
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT));
|
||||
RET(ff_vk_map_buffer(s, vkb, (void *)&buf_mapped, 0));
|
||||
|
||||
for (uint32_t i = 0; i < 256; i++) {
|
||||
uint32_t c = i << 24;
|
||||
for (int j = 0; j < 8; j++)
|
||||
c = (c << 1) ^ (0x04C11DB7 & (((int32_t) c) >> 31));
|
||||
buf_mapped[i] = av_bswap32(c);
|
||||
}
|
||||
set_crc_tab((uint32_t *)buf_mapped);
|
||||
|
||||
set_rc_state_tab(f, buf_mapped + 256*sizeof(uint32_t));
|
||||
|
||||
memcpy(buf_mapped + 256*sizeof(uint32_t) + 512*sizeof(uint8_t),
|
||||
f->quant_tables, sizeof(f->quant_tables));
|
||||
|
||||
RET(ff_vk_unmap_buffer(s, vkb, 1));
|
||||
|
||||
|
||||
@@ -28,17 +28,7 @@ void ff_ffv1_vk_set_common_sl(AVCodecContext *avctx, FFV1Context *f,
|
||||
VkSpecializationInfo *sl,
|
||||
enum AVPixelFormat sw_format);
|
||||
|
||||
int ff_ffv1_vk_update_state_transition_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f);
|
||||
|
||||
int ff_ffv1_vk_init_state_transition_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f);
|
||||
|
||||
int ff_ffv1_vk_init_quant_table_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f);
|
||||
|
||||
int ff_ffv1_vk_init_crc_table_data(FFVulkanContext *s,
|
||||
FFVkBuffer *vkb, FFV1Context *f);
|
||||
int ff_ffv1_vk_init_consts(FFVulkanContext *s, FFVkBuffer *vkb, FFV1Context *f);
|
||||
|
||||
typedef struct FFv1ShaderParams {
|
||||
VkDeviceAddress slice_data;
|
||||
|
||||
@@ -78,9 +78,7 @@ typedef struct VulkanEncodeFFv1Context {
|
||||
FFVulkanShader enc;
|
||||
|
||||
/* Constant read-only buffers */
|
||||
FFVkBuffer quant_buf;
|
||||
FFVkBuffer rangecoder_static_buf;
|
||||
FFVkBuffer crc_tab_buf;
|
||||
FFVkBuffer consts_buf;
|
||||
|
||||
/* Slice data buffer pool */
|
||||
AVBufferPool *slice_data_pool;
|
||||
@@ -1195,48 +1193,33 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Range coder data */
|
||||
err = ff_ffv1_vk_init_state_transition_data(&fv->s,
|
||||
&fv->rangecoder_static_buf,
|
||||
f);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Quantization table data */
|
||||
err = ff_ffv1_vk_init_quant_table_data(&fv->s,
|
||||
&fv->quant_buf,
|
||||
f);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* CRC table buffer */
|
||||
err = ff_ffv1_vk_init_crc_table_data(&fv->s,
|
||||
&fv->crc_tab_buf,
|
||||
f);
|
||||
/* Constant data */
|
||||
err = ff_ffv1_vk_init_consts(&fv->s, &fv->consts_buf, f);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Update setup global descriptors */
|
||||
RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
|
||||
&fv->setup, 0, 0, 0,
|
||||
&fv->rangecoder_static_buf,
|
||||
0, 512*sizeof(uint8_t),
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t), 512*sizeof(uint8_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
|
||||
/* Update encode global descriptors */
|
||||
RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
|
||||
&fv->enc, 0, 0, 0,
|
||||
&fv->rangecoder_static_buf,
|
||||
0, fv->rangecoder_static_buf.size,
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t), 512*sizeof(uint8_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
|
||||
&fv->enc, 0, 1, 0,
|
||||
&fv->quant_buf,
|
||||
0, VK_WHOLE_SIZE,
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t) + 512*sizeof(uint8_t),
|
||||
VK_WHOLE_SIZE,
|
||||
VK_FORMAT_UNDEFINED));
|
||||
RET(ff_vk_shader_update_desc_buffer(&fv->s, &fv->exec_pool.contexts[0],
|
||||
&fv->enc, 0, 2, 0,
|
||||
&fv->crc_tab_buf,
|
||||
&fv->consts_buf,
|
||||
0, 256*sizeof(uint32_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
|
||||
@@ -1292,9 +1275,7 @@ static av_cold int vulkan_encode_ffv1_close(AVCodecContext *avctx)
|
||||
av_buffer_unref(&fv->keyframe_slice_data_ref);
|
||||
av_buffer_pool_uninit(&fv->slice_data_pool);
|
||||
|
||||
ff_vk_free_buf(&fv->s, &fv->quant_buf);
|
||||
ff_vk_free_buf(&fv->s, &fv->rangecoder_static_buf);
|
||||
ff_vk_free_buf(&fv->s, &fv->crc_tab_buf);
|
||||
ff_vk_free_buf(&fv->s, &fv->consts_buf);
|
||||
|
||||
av_free(fv->buf_regions);
|
||||
av_frame_free(&fv->frame);
|
||||
|
||||
@@ -74,9 +74,7 @@ typedef struct FFv1VulkanDecodeContext {
|
||||
FFVulkanShader reset;
|
||||
FFVulkanShader decode;
|
||||
|
||||
FFVkBuffer rangecoder_buf;
|
||||
FFVkBuffer quant_buf;
|
||||
FFVkBuffer crc_buf;
|
||||
FFVkBuffer consts_buf;
|
||||
|
||||
AVBufferPool *slice_state_pool;
|
||||
AVBufferPool *slice_feedback_pool;
|
||||
@@ -732,9 +730,7 @@ static void vk_decode_ffv1_uninit(FFVulkanDecodeShared *ctx)
|
||||
ff_vk_shader_free(&ctx->s, &fv->reset);
|
||||
ff_vk_shader_free(&ctx->s, &fv->decode);
|
||||
|
||||
ff_vk_free_buf(&ctx->s, &fv->rangecoder_buf);
|
||||
ff_vk_free_buf(&ctx->s, &fv->quant_buf);
|
||||
ff_vk_free_buf(&ctx->s, &fv->crc_buf);
|
||||
ff_vk_free_buf(&ctx->s, &fv->consts_buf);
|
||||
|
||||
av_buffer_pool_uninit(&fv->slice_state_pool);
|
||||
av_buffer_pool_uninit(&fv->slice_feedback_pool);
|
||||
@@ -800,32 +796,31 @@ static int vk_decode_ffv1_init(AVCodecContext *avctx)
|
||||
dctx, hwfc, sl, f->ac, is_rgb));
|
||||
|
||||
/* Init static data */
|
||||
RET(ff_ffv1_vk_init_state_transition_data(&ctx->s, &fv->rangecoder_buf, f));
|
||||
RET(ff_ffv1_vk_init_crc_table_data(&ctx->s, &fv->crc_buf, f));
|
||||
RET(ff_ffv1_vk_init_quant_table_data(&ctx->s, &fv->quant_buf, f));
|
||||
RET(ff_ffv1_vk_init_consts(&ctx->s, &fv->consts_buf, f));
|
||||
|
||||
/* Update setup global descriptors */
|
||||
RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
|
||||
&fv->setup, 0, 0, 0,
|
||||
&fv->rangecoder_buf,
|
||||
0, 512*sizeof(uint8_t),
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t), 512*sizeof(uint8_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
|
||||
&fv->setup, 0, 1, 0,
|
||||
&fv->crc_buf,
|
||||
&fv->consts_buf,
|
||||
0, 256*sizeof(uint32_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
|
||||
/* Update decode global descriptors */
|
||||
RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
|
||||
&fv->decode, 0, 0, 0,
|
||||
&fv->rangecoder_buf,
|
||||
0, 512*sizeof(uint8_t),
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t), 512*sizeof(uint8_t),
|
||||
VK_FORMAT_UNDEFINED));
|
||||
RET(ff_vk_shader_update_desc_buffer(&ctx->s, &ctx->exec_pool.contexts[0],
|
||||
&fv->decode, 0, 1, 0,
|
||||
&fv->quant_buf,
|
||||
0, VK_WHOLE_SIZE,
|
||||
&fv->consts_buf,
|
||||
256*sizeof(uint32_t) + 512*sizeof(uint8_t),
|
||||
VK_WHOLE_SIZE,
|
||||
VK_FORMAT_UNDEFINED));
|
||||
|
||||
fail:
|
||||
|
||||
Reference in New Issue
Block a user