From fd95195f45aa00916b1442a964201b1567aeb604 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 16 Apr 2026 16:30:16 +0200 Subject: [PATCH] ac/surface: add stencil-only support for host mem->surf copies It's needed to tweak the surface info and to adjust the base pointer. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_surface.c | 22 ++++++++++++++++++---- src/amd/common/ac_surface.h | 2 ++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 8a71cae1d68..3e4695bbef0 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -4688,9 +4688,15 @@ gfx10_surface_copy_mem_surface(struct ac_addrlib *addrlib, const struct radeon_i texel_scale = 3; } + /* Adjust surface info for a stencil-only copy. */ + if (surf_copy_region->is_stencil_only) { + format = ADDR_FMT_8; + bpe = 1; + } + ADDR2_COPY_MEMSURFACE_INPUT input = {0}; input.size = sizeof(ADDR2_COPY_MEMSURFACE_INPUT); - input.swizzleMode = surf->has_stencil ? + input.swizzleMode = (surf->has_stencil && surf_copy_region->is_stencil_only) ? surf->u.gfx9.zs.stencil_swizzle_mode : surf->u.gfx9.swizzle_mode; input.format = format; @@ -4707,7 +4713,8 @@ gfx10_surface_copy_mem_surface(struct ac_addrlib *addrlib, const struct radeon_i input.numSamples = surf_info->samples; input.pitchInElement = surf->u.gfx9.pitch[surf_copy_region->level]; input.pbXor = surf->tile_swizzle; - input.pMappedSurface = (void *)surf_copy_region->surf_ptr; + input.pMappedSurface = (char *)surf_copy_region->surf_ptr + + (surf_copy_region->is_stencil_only ? surf->u.gfx9.zs.stencil_offset : 0); ADDR_E_RETURNCODE res; ADDR2_COPY_MEMSURFACE_REGION region = {0}; @@ -4755,9 +4762,15 @@ gfx12_surface_copy_mem_surface(struct ac_addrlib *addrlib, const struct radeon_i texel_scale = 3; } + /* Adjust surface info for a stencil-only copy. */ + if (surf_copy_region->is_stencil_only) { + format = ADDR_FMT_8; + bpe = 1; + } + ADDR3_COPY_MEMSURFACE_INPUT input = {0}; input.size = sizeof(ADDR3_COPY_MEMSURFACE_INPUT); - input.swizzleMode = surf->has_stencil ? + input.swizzleMode = (surf->has_stencil && surf_copy_region->is_stencil_only) ? surf->u.gfx9.zs.stencil_swizzle_mode : surf->u.gfx9.swizzle_mode; input.format = format; @@ -4773,7 +4786,8 @@ gfx12_surface_copy_mem_surface(struct ac_addrlib *addrlib, const struct radeon_i input.numSamples = surf_info->samples; input.pitchInElement = surf->u.gfx9.pitch[surf_copy_region->level]; input.pbXor = surf->tile_swizzle; - input.pMappedSurface = (void *)surf_copy_region->surf_ptr; + input.pMappedSurface = (char *)surf_copy_region->surf_ptr + + (surf_copy_region->is_stencil_only ? surf->u.gfx9.zs.stencil_offset : 0); ADDR_E_RETURNCODE res; ADDR3_COPY_MEMSURFACE_REGION region = {0}; diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h index 44fe74dd786..7c3bcd9a1e4 100644 --- a/src/amd/common/ac_surface.h +++ b/src/amd/common/ac_surface.h @@ -558,6 +558,8 @@ struct ac_surface_copy_region { uint64_t mem_row_pitch; uint64_t mem_slice_pitch; + + bool is_stencil_only; }; bool ac_surface_copy_mem_to_surface(struct ac_addrlib *addrlib, const struct radeon_info *info,