[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; int canBlit;
VkExtent2D extent; VkExtent2D extent;
qfv_capture_image_set_t *image_set; qfv_capture_image_set_t *image_set;
size_t imgsize;
size_t memsize; size_t memsize;
byte *data;
VkDeviceMemory memory; VkDeviceMemory memory;
} qfv_capture_t; } qfv_capture_t;

View File

@ -131,6 +131,7 @@ DEVICE_LEVEL_VULKAN_FUNCTION (vkFreeMemory)
DEVICE_LEVEL_VULKAN_FUNCTION (vkMapMemory) DEVICE_LEVEL_VULKAN_FUNCTION (vkMapMemory)
DEVICE_LEVEL_VULKAN_FUNCTION (vkUnmapMemory) DEVICE_LEVEL_VULKAN_FUNCTION (vkUnmapMemory)
DEVICE_LEVEL_VULKAN_FUNCTION (vkFlushMappedMemoryRanges) DEVICE_LEVEL_VULKAN_FUNCTION (vkFlushMappedMemoryRanges)
DEVICE_LEVEL_VULKAN_FUNCTION (vkInvalidateMappedMemoryRanges)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCreateSampler) DEVICE_LEVEL_VULKAN_FUNCTION (vkCreateSampler)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCreateDescriptorSetLayout) 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->layout = VK_IMAGE_LAYOUT_UNDEFINED;
image->cmd = cmdset->a[i]; image->cmd = cmdset->a[i];
} }
size_t image_size = QFV_GetImageSize (device, capture->imgsize = QFV_GetImageSize (device,
capture->image_set->a[0].image); capture->image_set->a[0].image);
capture->memsize = numframes * image_size; capture->memsize = numframes * capture->imgsize;
capture->memory = QFV_AllocImageMemory (device, capture->memory = QFV_AllocImageMemory (device,
capture->image_set->a[0].image, capture->image_set->a[0].image,
VK_MEMORY_PROPERTY_HOST_CACHED_BIT, VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
capture->memsize, 0); capture->memsize, 0);
byte *data;
dfunc->vkMapMemory (device->dev, capture->memory, 0, capture->memsize, 0, dfunc->vkMapMemory (device->dev, capture->memory, 0, capture->memsize, 0,
(void **) &data); (void **) &capture->data);
for (int i = 0; i < numframes; i++) { for (int i = 0; i < numframes; i++) {
__auto_type image = &capture->image_set->a[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, dfunc->vkBindImageMemory (device->dev, image->image, capture->memory,
image->data - data); image->data - capture->data);
} }
return capture; return capture;
} }
@ -252,6 +251,15 @@ QFV_CaptureImage (qfv_capture_t *capture, VkImage scImage, int frame)
const byte * const byte *
QFV_CaptureData (qfv_capture_t *capture, int frame) 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]; __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; return image->data;
} }