lavapipe: fix indirect memory copies

this was using the wrong size for the copy

cc: mesa-stable

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41312>
(cherry picked from commit 87764963f2)
This commit is contained in:
Mike Blumenkrantz 2026-04-30 11:07:12 -04:00 committed by Eric Engestrom
parent 438cc6b127
commit b98ec1880e
2 changed files with 6 additions and 4 deletions

View file

@ -1674,7 +1674,7 @@
"description": "lavapipe: fix indirect memory copies",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null,
"notes": null

View file

@ -2543,16 +2543,18 @@ static void handle_copy_memory_indirect(struct vk_cmd_queue_entry *cmd,
{
const VkCopyMemoryIndirectInfoKHR *copycmd = cmd->u.copy_memory_indirect_khr.copy_memory_indirect_info;
uint8_t *base = (uint8_t*)(uintptr_t)copycmd->copyAddressRange.address;
for (uint32_t i = 0; i < copycmd->copyCount; i++) {
uint8_t *ptr = (void*)(uintptr_t)copycmd->copyAddressRange.address;
VkCopyMemoryIndirectCommandKHR *copy = (void*)(ptr + i * copycmd->copyAddressRange.stride);
if (i * copycmd->copyAddressRange.stride > copycmd->copyAddressRange.size)
break;
VkCopyMemoryIndirectCommandKHR *copy = (void*)(base + i * copycmd->copyAddressRange.stride);
void *src = (void*)(uintptr_t)copy->srcAddress;
void *dst = (void*)(uintptr_t)copy->dstAddress;
/* Techincally apps passing in size of zero still need valid pointers,
* but in case they don't (which is easy to do) we don't want undefined behavior (or crash) in memcpy.
*/
if (copy->size != 0)
memcpy(dst, src, copycmd->copyAddressRange.size);
memcpy(dst, src, copy->size);
}
}