diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c index 92e97f7e0bc..94bfc7ec0ad 100644 --- a/src/gallium/drivers/radeonsi/si_texture.c +++ b/src/gallium/drivers/radeonsi/si_texture.c @@ -617,7 +617,8 @@ static void si_set_tex_bo_metadata(struct si_screen *sscreen, struct si_texture bool is_array = util_texture_is_array(res->target); uint32_t desc[8]; - sscreen->make_texture_descriptor(sscreen, tex, true, res->target, res->format, swizzle, 0, + sscreen->make_texture_descriptor(sscreen, tex, true, res->target, + tex->is_depth ? tex->db_render_format : res->format, swizzle, 0, res->last_level, 0, is_array ? res->array_size - 1 : 0, res->width0, res->height0, res->depth0, true, desc, NULL); si_set_mutable_tex_desc_fields(sscreen, tex, &tex->surface.u.legacy.level[0], 0, 0, @@ -1106,6 +1107,12 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen, tex->can_sample_z = true; tex->can_sample_s = true; } + + /* Always set BO metadata - required for programming DCC fields for GFX12 SDMA in the kernel. + * If the texture is suballocated, this will overwrite the metadata for all suballocations, + * but there is nothing we can do about that. + */ + si_set_tex_bo_metadata(sscreen, tex); return tex; } diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c index 5668a2a9be5..681934547a8 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_bo.c @@ -1324,7 +1324,8 @@ static void amdgpu_buffer_set_metadata(struct radeon_winsys *rws, struct radeon_surf *surf) { struct amdgpu_winsys *aws = amdgpu_winsys(rws); - struct amdgpu_bo_real *bo = get_real_bo(amdgpu_winsys_bo(_buf)); + struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(_buf); + struct amdgpu_bo_real *real = is_real_bo(bo) ? get_real_bo(bo) : get_slab_entry_real_bo(bo); struct amdgpu_bo_metadata metadata = {0}; ac_surface_compute_bo_metadata(&aws->info, surf, &metadata.tiling_info); @@ -1332,7 +1333,7 @@ static void amdgpu_buffer_set_metadata(struct radeon_winsys *rws, metadata.size_metadata = md->size_metadata; memcpy(metadata.umd_metadata, md->metadata, sizeof(md->metadata)); - amdgpu_bo_set_metadata(bo->bo_handle, &metadata); + amdgpu_bo_set_metadata(real->bo_handle, &metadata); } struct pb_buffer_lean *