From ad0aec9adb6974210ab9f19780585419b5ed07b3 Mon Sep 17 00:00:00 2001 From: Matt Borgerson Date: Fri, 26 Jul 2024 17:21:02 -0700 Subject: [PATCH] nv2a/vk: Move overlapping surface download logic to function --- hw/xbox/nv2a/pgraph/vk/renderer.h | 1 + hw/xbox/nv2a/pgraph/vk/surface.c | 17 +++++++++++++++++ hw/xbox/nv2a/pgraph/vk/texture.c | 11 ++--------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/hw/xbox/nv2a/pgraph/vk/renderer.h b/hw/xbox/nv2a/pgraph/vk/renderer.h index c66e354193..e764832239 100644 --- a/hw/xbox/nv2a/pgraph/vk/renderer.h +++ b/hw/xbox/nv2a/pgraph/vk/renderer.h @@ -447,6 +447,7 @@ void pgraph_vk_surface_download_if_dirty(NV2AState *d, SurfaceBinding *surface); SurfaceBinding *pgraph_vk_surface_get_within(NV2AState *d, hwaddr addr); void pgraph_vk_wait_for_surface_download(SurfaceBinding *e); void pgraph_vk_download_dirty_surfaces(NV2AState *d); +void pgraph_vk_download_surfaces_in_range_if_dirty(PGRAPHState *pg, hwaddr start, hwaddr size); void pgraph_vk_upload_surface_data(NV2AState *d, SurfaceBinding *surface, bool force); void pgraph_vk_surface_update(NV2AState *d, bool upload, bool color_write, diff --git a/hw/xbox/nv2a/pgraph/vk/surface.c b/hw/xbox/nv2a/pgraph/vk/surface.c index f45a129525..d90995ba01 100644 --- a/hw/xbox/nv2a/pgraph/vk/surface.c +++ b/hw/xbox/nv2a/pgraph/vk/surface.c @@ -122,6 +122,23 @@ static void memcpy_image(void *dst, void const *src, int dst_stride, } } +void pgraph_vk_download_surfaces_in_range_if_dirty(PGRAPHState *pg, hwaddr start, hwaddr size) +{ + PGRAPHVkState *r = pg->vk_renderer_state; + SurfaceBinding *surface; + + hwaddr end = start + size - 1; + + QTAILQ_FOREACH(surface, &r->surfaces, entry) { + hwaddr surf_end = surface->vram_addr + surface->size - 1; + bool overlapping = !(surface->vram_addr >= end || start >= surf_end); + if (overlapping) { + pgraph_vk_surface_download_if_dirty( + container_of(pg, NV2AState, pgraph), surface); + } + } +} + static void download_surface_to_buffer(NV2AState *d, SurfaceBinding *surface, uint8_t *pixels) { diff --git a/hw/xbox/nv2a/pgraph/vk/texture.c b/hw/xbox/nv2a/pgraph/vk/texture.c index 2478f61d71..cbdabf660f 100644 --- a/hw/xbox/nv2a/pgraph/vk/texture.c +++ b/hw/xbox/nv2a/pgraph/vk/texture.c @@ -1066,15 +1066,8 @@ static void create_texture(PGRAPHState *pg, int texture_idx) // FIXME: Restructure to support rendering surfaces to cubemap faces // Writeback any surfaces which this texture may index - hwaddr tex_vram_end = texture_vram_offset + texture_length - 1; - QTAILQ_FOREACH(surface, &r->surfaces, entry) { - hwaddr surf_vram_end = surface->vram_addr + surface->size - 1; - bool overlapping = !(surface->vram_addr >= tex_vram_end - || texture_vram_offset >= surf_vram_end); - if (overlapping) { - pgraph_vk_surface_download_if_dirty(d, surface); - } - } + pgraph_vk_download_surfaces_in_range_if_dirty( + pg, texture_vram_offset, texture_length); } if (surface_to_texture && pg->surface_scale_factor > 1) {