[vulkan] Invalidate mapped capture image memory

I think I had gotten lucky with captures not being corrupt due to them
being much bigger than all but the L3 cache (and then they're over 1/2
the size), so the memory was being automatically invalidated by other
activity. Don't want to trust such luck, though.
This commit is contained in:
Bill Currie 2022-04-01 16:19:10 +09:00
parent 42a03758c5
commit 6bbbe4997b
3 changed files with 18 additions and 7 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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;
}