Instead use a field where possible and the defined constant when not. Tested by using 4096 slices.
Unified · Split
| @@ -1012,6 +1012,7 @@ static int init_rct_search_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 1011 unmodified lines | ||
| 1012 | 1012 | { |
| 1013 | 1013 | int err; |
| 1014 | 1014 | VulkanEncodeFFv1Context *fv = avctx->priv_data; |
| 1015 | + FFV1Context *f = &fv->ctx; | |
| 1015 | 1016 | FFVulkanShader *shd = &fv->rct_search; |
| 1016 | 1017 | FFVulkanDescriptorSetBinding *desc_set; |
| 1017 | 1018 | |
| @@ -1075,7 +1076,8 @@ static int init_rct_search_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 57 unmodified lines | ||
| 1075 | 1076 | .name = "slice_data_buf", |
| 1076 | 1077 | .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 1077 | 1078 | .stages = VK_SHADER_STAGE_COMPUTE_BIT, |
| 1078 | − .buf_content = "SliceContext slice_ctx[1024];", | |
| 1079 | + .buf_content = "SliceContext slice_ctx", | |
| 1080 | + .buf_elems = f->max_slice_count, | |
| 1079 | 1081 | }, |
| 1080 | 1082 | { |
| 1081 | 1083 | .name = "src", |
| @@ -1109,6 +1111,7 @@ static int init_setup_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 27 unmodified lines | ||
| 1109 | 1111 | { |
| 1110 | 1112 | int err; |
| 1111 | 1113 | VulkanEncodeFFv1Context *fv = avctx->priv_data; |
| 1114 | + FFV1Context *f = &fv->ctx; | |
| 1112 | 1115 | FFVulkanShader *shd = &fv->setup; |
| 1113 | 1116 | FFVulkanDescriptorSetBinding *desc_set; |
| 1114 | 1117 | |
| @@ -1158,7 +1161,8 @@ static int init_setup_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 43 unmodified lines | ||
| 1158 | 1161 | .name = "slice_data_buf", |
| 1159 | 1162 | .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 1160 | 1163 | .stages = VK_SHADER_STAGE_COMPUTE_BIT, |
| 1161 | − .buf_content = "SliceContext slice_ctx[1024];", | |
| 1164 | + .buf_content = "SliceContext slice_ctx", | |
| 1165 | + .buf_elems = f->max_slice_count, | |
| 1162 | 1166 | }, |
| 1163 | 1167 | { |
| 1164 | 1168 | .name = "src", |
| @@ -1192,6 +1196,7 @@ static int init_reset_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 27 unmodified lines | ||
| 1192 | 1196 | { |
| 1193 | 1197 | int err; |
| 1194 | 1198 | VulkanEncodeFFv1Context *fv = avctx->priv_data; |
| 1199 | + FFV1Context *f = &fv->ctx; | |
| 1195 | 1200 | FFVulkanShader *shd = &fv->reset; |
| 1196 | 1201 | FFVulkanDescriptorSetBinding *desc_set; |
| 1197 | 1202 | |
| @@ -1254,7 +1259,8 @@ static int init_reset_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 56 unmodified lines | ||
| 1254 | 1259 | .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 1255 | 1260 | .mem_quali = "readonly", |
| 1256 | 1261 | .stages = VK_SHADER_STAGE_COMPUTE_BIT, |
| 1257 | − .buf_content = "SliceContext slice_ctx[1024];", | |
| 1262 | + .buf_content = "SliceContext slice_ctx", | |
| 1263 | + .buf_elems = f->max_slice_count, | |
| 1258 | 1264 | }, |
| 1259 | 1265 | }; |
| 1260 | 1266 | RET(ff_vk_shader_add_descriptor_set(&fv->s, shd, desc_set, 1, 0, 0)); |
| @@ -1278,6 +1284,7 @@ static int init_encode_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 17 unmodified lines | ||
| 1278 | 1284 | { |
| 1279 | 1285 | int err; |
| 1280 | 1286 | VulkanEncodeFFv1Context *fv = avctx->priv_data; |
| 1287 | + FFV1Context *f = &fv->ctx; | |
| 1281 | 1288 | FFVulkanShader *shd = &fv->enc; |
| 1282 | 1289 | FFVulkanDescriptorSetBinding *desc_set; |
| 1283 | 1290 | |
| @@ -1339,7 +1346,8 @@ static int init_encode_shader(AVCodecContext *avctx, FFVkSPIRVCompiler *spv) · 55 unmodified lines | ||
| 1339 | 1346 | .name = "slice_data_buf", |
| 1340 | 1347 | .type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, |
| 1341 | 1348 | .stages = VK_SHADER_STAGE_COMPUTE_BIT, |
| 1342 | − .buf_content = "SliceContext slice_ctx[1024];", | |
| 1349 | + .buf_content = "SliceContext slice_ctx", | |
| 1350 | + .buf_elems = f->max_slice_count, | |
| 1343 | 1351 | }, |
| 1344 | 1352 | { |
| 1345 | 1353 | .name = "src", |
| @@ -1483,22 +1491,24 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) · 137 unmodified lines | ||
| 1483 | 1491 | f->num_v_slices = 32; |
| 1484 | 1492 | } |
| 1485 | 1493 | } else if (f->num_h_slices && f->num_v_slices <= 0) { |
| 1486 | − f->num_v_slices = 1024 / f->num_h_slices; | |
| 1494 | + f->num_v_slices = MAX_SLICES / f->num_h_slices; | |
| 1487 | 1495 | } else if (f->num_v_slices && f->num_h_slices <= 0) { |
| 1488 | − f->num_h_slices = 1024 / f->num_v_slices; | |
| 1496 | + f->num_h_slices = MAX_SLICES / f->num_v_slices; | |
| 1489 | 1497 | } |
| 1490 | 1498 | |
| 1491 | 1499 | f->num_h_slices = FFMIN(f->num_h_slices, avctx->width); |
| 1492 | 1500 | f->num_v_slices = FFMIN(f->num_v_slices, avctx->height); |
| 1493 | 1501 | |
| 1494 | − if (f->num_h_slices * f->num_v_slices > 1024) { | |
| 1502 | + if (f->num_h_slices * f->num_v_slices > MAX_SLICES) { | |
| 1495 | 1503 | av_log(avctx, AV_LOG_ERROR, "Too many slices (%i), maximum supported " |
| 1496 | − "by the standard is 1024\n", | |
| 1497 | − f->num_h_slices * f->num_v_slices); | |
| 1504 | + "by the standard is %i\n", | |
| 1505 | + f->num_h_slices * f->num_v_slices, MAX_SLICES); | |
| 1498 | 1506 | return AVERROR_PATCHWELCOME; |
| 1499 | 1507 | } |
| 1500 | 1508 | } |
| 1501 | 1509 | |
| 1510 | + f->max_slice_count = f->num_h_slices * f->num_v_slices; | |
| 1511 | + | |
| 1502 | 1512 | if ((err = ff_ffv1_write_extradata(avctx)) < 0) |
| 1503 | 1513 | return err; |
| 1504 | 1514 | |
| @@ -1707,7 +1717,6 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) · 202 unmodified lines | ||
| 1707 | 1717 | for (int i = 0; i < fv->async_depth; i++) |
| 1708 | 1718 | fv->exec_pool.contexts[i].opaque = &fv->exec_ctx_info[i]; |
| 1709 | 1719 | |
| 1710 | − f->max_slice_count = f->num_h_slices * f->num_v_slices; | |
| 1711 | 1720 | fv->buf_regions = av_malloc_array(f->max_slice_count, sizeof(*fv->buf_regions)); |
| 1712 | 1721 | if (!fv->buf_regions) |
| 1713 | 1722 | return AVERROR(ENOMEM); |
| @@ -1783,9 +1792,9 @@ static const AVOption vulkan_encode_ffv1_options[] = { · 69 unmodified lines | ||
| 1783 | 1792 | { .i64 = QTABLE_GT8BIT }, INT_MIN, INT_MAX, VE, .unit = "qtable" }, |
| 1784 | 1793 | |
| 1785 | 1794 | { "slices_h", "Number of horizontal slices", OFFSET(num_h_slices), AV_OPT_TYPE_INT, |
| 1786 | − { .i64 = -1 }, -1, 1024, VE }, | |
| 1795 | + { .i64 = -1 }, -1, MAX_SLICES, VE }, | |
| 1787 | 1796 | { "slices_v", "Number of vertical slices", OFFSET(num_v_slices), AV_OPT_TYPE_INT, |
| 1788 | − { .i64 = -1 }, -1, 1024, VE }, | |
| 1797 | + { .i64 = -1 }, -1, MAX_SLICES, VE }, | |
| 1789 | 1798 | |
| 1790 | 1799 | { "force_pcm", "Code all slices with no prediction", OFFSET(force_pcm), AV_OPT_TYPE_BOOL, |
| 1791 | 1800 | { .i64 = 0 }, 0, 1, VE }, |