From fcc0fd2fc1d3265da51785abb70ee243201f8f0f Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Wed, 29 May 2024 18:15:45 +0200 Subject: [PATCH] gallium: Add a memory range parameter to resource_bind_backing Needed to bind regions of the resource. Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/auxiliary/driver_trace/tr_screen.c | 8 ++++++-- src/gallium/drivers/llvmpipe/lp_texture.c | 2 ++ src/gallium/frontends/lavapipe/lvp_descriptor_set.c | 4 ++-- src/gallium/frontends/lavapipe/lvp_device.c | 3 +++ src/gallium/frontends/lavapipe/lvp_execute.c | 2 +- src/gallium/include/pipe/p_screen.h | 2 ++ 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/gallium/auxiliary/driver_trace/tr_screen.c b/src/gallium/auxiliary/driver_trace/tr_screen.c index 9803524b14b..cc0faf7ea84 100644 --- a/src/gallium/auxiliary/driver_trace/tr_screen.c +++ b/src/gallium/auxiliary/driver_trace/tr_screen.c @@ -678,7 +678,7 @@ trace_screen_free_memory(struct pipe_screen *_screen, static void trace_screen_free_memory_fd(struct pipe_screen *_screen, - struct pipe_memory_allocation *pmem) + struct pipe_memory_allocation *pmem) { struct trace_screen *tr_scr = trace_screen(_screen); struct pipe_screen *screen = tr_scr->screen; @@ -698,6 +698,8 @@ static bool trace_screen_resource_bind_backing(struct pipe_screen *_screen, struct pipe_resource *resource, struct pipe_memory_allocation *pmem, + uint64_t fd_offset, + uint64_t size, uint64_t offset) { struct trace_screen *tr_scr = trace_screen(_screen); @@ -709,9 +711,11 @@ trace_screen_resource_bind_backing(struct pipe_screen *_screen, trace_dump_arg(ptr, screen); trace_dump_arg(ptr, resource); trace_dump_arg(ptr, pmem); + trace_dump_arg(uint, fd_offset); + trace_dump_arg(uint, size); trace_dump_arg(uint, offset); - result = screen->resource_bind_backing(screen, resource, pmem, offset); + result = screen->resource_bind_backing(screen, resource, pmem, fd_offset, size, offset); trace_dump_ret(bool, result); diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index 520101b9764..8da39ef1874 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -1313,6 +1313,8 @@ static bool llvmpipe_resource_bind_backing(struct pipe_screen *pscreen, struct pipe_resource *pt, struct pipe_memory_allocation *pmem, + uint64_t fd_offset, + uint64_t size, uint64_t offset) { struct llvmpipe_screen *screen = llvmpipe_screen(pscreen); diff --git a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c index 5f11be08f69..8ca4edc7b4a 100644 --- a/src/gallium/frontends/lavapipe/lvp_descriptor_set.c +++ b/src/gallium/frontends/lavapipe/lvp_descriptor_set.c @@ -256,7 +256,7 @@ get_buffer_resource(struct pipe_context *ctx, const VkDescriptorAddressInfoEXT * .cpu_addr = (void *)(uintptr_t)bda->address, }; - pscreen->resource_bind_backing(pscreen, pres, (void *)&alloc, 0); + pscreen->resource_bind_backing(pscreen, pres, (void *)&alloc, 0, 0, 0); return pres; } @@ -356,7 +356,7 @@ lvp_descriptor_set_create(struct lvp_device *device, set->map = device->pscreen->map_memory(device->pscreen, set->pmem); memset(set->map, 0, bo_size); - device->pscreen->resource_bind_backing(device->pscreen, set->bo, set->pmem, 0); + device->pscreen->resource_bind_backing(device->pscreen, set->bo, set->pmem, 0, 0, 0); for (uint32_t binding_index = 0; binding_index < layout->binding_count; binding_index++) { const struct lvp_descriptor_set_binding_layout *bind_layout = &set->layout->binding[binding_index]; diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 13fabb97df0..b17d655db4b 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -2151,6 +2151,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_BindBufferMemory2(VkDevice _device, device->pscreen->resource_bind_backing(device->pscreen, buffer->bo, mem->pmem, + 0, 0, pBindInfos[i].memoryOffset); if (status) *status->pResult = VK_SUCCESS; @@ -2168,6 +2169,7 @@ lvp_image_plane_bind(struct lvp_device *device, if (!device->pscreen->resource_bind_backing(device->pscreen, plane->bo, mem->pmem, + 0, 0, memory_offset + *plane_offset)) { /* This is probably caused by the texture being too large, so let's * report this as the *closest* allowed error-code. It's not ideal, @@ -2210,6 +2212,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_BindImageMemory2(VkDevice _device, device->pscreen->resource_bind_backing(device->pscreen, image->planes[0].bo, image->planes[0].pmem, + 0, 0, image->planes[0].memory_offset); did_bind = true; if (status) diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index c91c524153c..e6531896ce9 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -232,7 +232,7 @@ get_buffer_resource(struct pipe_context *ctx, void *mem) .cpu_addr = mem, }; - pscreen->resource_bind_backing(pscreen, pres, (void *)&alloc, 0); + pscreen->resource_bind_backing(pscreen, pres, (void *)&alloc, 0, 0, 0); return pres; } diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h index d45e64bee68..ff2253f2a30 100644 --- a/src/gallium/include/pipe/p_screen.h +++ b/src/gallium/include/pipe/p_screen.h @@ -691,6 +691,8 @@ struct pipe_screen { bool (*resource_bind_backing)(struct pipe_screen *screen, struct pipe_resource *pt, struct pipe_memory_allocation *pmem, + uint64_t fd_offset, + uint64_t size, uint64_t offset); /**