| 1335 | } |
| 1336 | |
| 1337 | static int create_mapped_buffer(FFVulkanContext *s, |
| 1338 | FFVkBuffer *vkb, VkBufferUsageFlags usage, |
| 1339 | size_t size, |
| 1340 | VkExternalMemoryBufferCreateInfo *create_desc, |
| 1341 | VkImportMemoryHostPointerInfoEXT *import_desc, |
| 1342 | VkMemoryHostPointerPropertiesEXT props) |
| 1343 | { |
| 1344 | int err; |
| 1345 | VkResult ret; |
| 1346 | FFVulkanFunctions *vk = &s->vkfn; |
| 1347 | |
| 1348 | VkBufferCreateInfo buf_spawn = { |
| 1349 | .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, |
| 1350 | .pNext = create_desc, |
| 1351 | .usage = usage, |
| 1352 | .sharingMode = VK_SHARING_MODE_EXCLUSIVE, |
| 1353 | .size = size, |
| 1354 | }; |
| 1355 | VkMemoryRequirements req = { |
| 1356 | .size = size, |
| 1357 | .alignment = s->hprops.minImportedHostPointerAlignment, |
| 1358 | .memoryTypeBits = props.memoryTypeBits, |
| 1359 | }; |
| 1360 | |
| 1361 | err = ff_vk_alloc_mem(s, &req, |
| 1362 | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, |
| 1363 | import_desc, &vkb->flags, &vkb->mem); |
| 1364 | if (err < 0) |
| 1365 | return err; |
| 1366 | |
| 1367 | ret = vk->CreateBuffer(s->hwctx->act_dev, &buf_spawn, s->hwctx->alloc, &vkb->buf); |
| 1368 | if (ret != VK_SUCCESS) { |
| 1369 | vk->FreeMemory(s->hwctx->act_dev, vkb->mem, s->hwctx->alloc); |
| 1370 | return AVERROR_EXTERNAL; |
| 1371 | } |
| 1372 | |
| 1373 | ret = vk->BindBufferMemory(s->hwctx->act_dev, vkb->buf, vkb->mem, 0); |
| 1374 | if (ret != VK_SUCCESS) { |
| 1375 | vk->FreeMemory(s->hwctx->act_dev, vkb->mem, s->hwctx->alloc); |
| 1376 | vk->DestroyBuffer(s->hwctx->act_dev, vkb->buf, s->hwctx->alloc); |
| 1377 | return AVERROR_EXTERNAL; |
| 1378 | } |
| 1379 | |
| 1380 | return 0; |
| 1381 | } |
| 1382 | |
| 1383 | static void destroy_avvkbuf(void *opaque, uint8_t *data) |
| 1384 | { |
no test coverage detected