| 1284 | } |
| 1285 | |
| 1286 | int ff_vk_get_pooled_buffer(FFVulkanContext *ctx, AVBufferPool **buf_pool, |
| 1287 | AVBufferRef **buf, VkBufferUsageFlags usage, |
| 1288 | void *create_pNext, size_t size, |
| 1289 | VkMemoryPropertyFlagBits mem_props) |
| 1290 | { |
| 1291 | int err; |
| 1292 | AVBufferRef *ref; |
| 1293 | FFVkBuffer *data; |
| 1294 | |
| 1295 | *buf = NULL; |
| 1296 | |
| 1297 | if (!(*buf_pool)) { |
| 1298 | *buf_pool = av_buffer_pool_init2(sizeof(FFVkBuffer), ctx, |
| 1299 | alloc_data_buf, NULL); |
| 1300 | if (!(*buf_pool)) |
| 1301 | return AVERROR(ENOMEM); |
| 1302 | } |
| 1303 | |
| 1304 | *buf = ref = av_buffer_pool_get(*buf_pool); |
| 1305 | if (!ref) |
| 1306 | return AVERROR(ENOMEM); |
| 1307 | |
| 1308 | data = (FFVkBuffer *)ref->data; |
| 1309 | |
| 1310 | if (data->size >= size) |
| 1311 | return 0; |
| 1312 | |
| 1313 | ff_vk_free_buf(ctx, data); |
| 1314 | memset(data, 0, sizeof(*data)); |
| 1315 | |
| 1316 | err = ff_vk_create_buf(ctx, data, size, |
| 1317 | create_pNext, NULL, usage, |
| 1318 | mem_props); |
| 1319 | if (err < 0) { |
| 1320 | av_buffer_unref(&ref); |
| 1321 | *buf = NULL; |
| 1322 | return err; |
| 1323 | } |
| 1324 | |
| 1325 | if (mem_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { |
| 1326 | err = ff_vk_map_buffer(ctx, data, &data->mapped_mem, 0); |
| 1327 | if (err < 0) { |
| 1328 | av_buffer_unref(&ref); |
| 1329 | *buf = NULL; |
| 1330 | return err; |
| 1331 | } |
| 1332 | } |
| 1333 | |
| 1334 | return 0; |
| 1335 | } |
| 1336 | |
| 1337 | static int create_mapped_buffer(FFVulkanContext *s, |
| 1338 | FFVkBuffer *vkb, VkBufferUsageFlags usage, |
no test coverage detected