diff --git a/include/QF/Vulkan/capture.h b/include/QF/Vulkan/capture.h index a2fa1397b..6cfd9d47e 100644 --- a/include/QF/Vulkan/capture.h +++ b/include/QF/Vulkan/capture.h @@ -23,7 +23,9 @@ typedef struct qfv_capture_s { int canBlit; VkExtent2D extent; qfv_capture_image_set_t *image_set; + size_t imgsize; size_t memsize; + byte *data; VkDeviceMemory memory; } qfv_capture_t; diff --git a/include/QF/Vulkan/funclist.h b/include/QF/Vulkan/funclist.h index 1dec3bcc3..94189143d 100644 --- a/include/QF/Vulkan/funclist.h +++ b/include/QF/Vulkan/funclist.h @@ -131,6 +131,7 @@ DEVICE_LEVEL_VULKAN_FUNCTION (vkFreeMemory) DEVICE_LEVEL_VULKAN_FUNCTION (vkMapMemory) DEVICE_LEVEL_VULKAN_FUNCTION (vkUnmapMemory) DEVICE_LEVEL_VULKAN_FUNCTION (vkFlushMappedMemoryRanges) +DEVICE_LEVEL_VULKAN_FUNCTION (vkInvalidateMappedMemoryRanges) DEVICE_LEVEL_VULKAN_FUNCTION (vkCreateSampler) DEVICE_LEVEL_VULKAN_FUNCTION (vkCreateDescriptorSetLayout) diff --git a/libs/video/renderer/vulkan/capture.c b/libs/video/renderer/vulkan/capture.c index a7c190fe9..d11ea7ad9 100644 --- a/libs/video/renderer/vulkan/capture.c +++ b/libs/video/renderer/vulkan/capture.c @@ -99,22 +99,21 @@ QFV_CreateCapture (qfv_device_t *device, int numframes, image->layout = VK_IMAGE_LAYOUT_UNDEFINED; image->cmd = cmdset->a[i]; } - size_t image_size = QFV_GetImageSize (device, - capture->image_set->a[0].image); - capture->memsize = numframes * image_size; + capture->imgsize = QFV_GetImageSize (device, + capture->image_set->a[0].image); + capture->memsize = numframes * capture->imgsize; capture->memory = QFV_AllocImageMemory (device, capture->image_set->a[0].image, VK_MEMORY_PROPERTY_HOST_CACHED_BIT, capture->memsize, 0); - byte *data; dfunc->vkMapMemory (device->dev, capture->memory, 0, capture->memsize, 0, - (void **) &data); + (void **) &capture->data); for (int i = 0; i < numframes; i++) { __auto_type image = &capture->image_set->a[i]; - image->data = data + i * image_size; + image->data = capture->data + i * capture->imgsize; dfunc->vkBindImageMemory (device->dev, image->image, capture->memory, - image->data - data); + image->data - capture->data); } return capture; } @@ -252,6 +251,15 @@ QFV_CaptureImage (qfv_capture_t *capture, VkImage scImage, int frame) const byte * QFV_CaptureData (qfv_capture_t *capture, int frame) { + qfv_device_t *device = capture->device; + qfv_devfuncs_t *dfunc = device->funcs; __auto_type image = &capture->image_set->a[frame]; + VkMappedMemoryRange range = { + VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, + .memory = capture->memory, + .offset = image->data - capture->data, + .size = capture->imgsize, + }; + dfunc->vkInvalidateMappedMemoryRanges (device->dev, 1, &range); return image->data; }