From 86da24b8b974e9a2ff40e2614f168e11a73b34fc Mon Sep 17 00:00:00 2001 From: Matt Borgerson Date: Sun, 22 Jun 2025 23:33:28 -0700 Subject: [PATCH] nv2a/vk: Only include palette in texture key when necessary Fixes degraded performance due to garbage palette details polluting the texture cache. --- hw/xbox/nv2a/pgraph/vk/texture.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/hw/xbox/nv2a/pgraph/vk/texture.c b/hw/xbox/nv2a/pgraph/vk/texture.c index 69043b2e04..d4dd6a7999 100644 --- a/hw/xbox/nv2a/pgraph/vk/texture.c +++ b/hw/xbox/nv2a/pgraph/vk/texture.c @@ -1089,12 +1089,9 @@ static void create_texture(PGRAPHState *pg, int texture_idx) BasicColorFormatInfo f_basic = kelvin_color_format_info_map[state.color_format]; const hwaddr texture_vram_offset = pgraph_get_texture_phys_addr(pg, texture_idx); - size_t texture_palette_data_size; - const hwaddr texture_palette_vram_offset = - pgraph_get_texture_palette_phys_addr_length(pg, texture_idx, - &texture_palette_data_size); - size_t texture_length = pgraph_get_texture_length(pg, &state); + hwaddr texture_palette_vram_offset = 0; + size_t texture_palette_data_size = 0; uint32_t filter = pgraph_reg_r(pg, NV_PGRAPH_TEXFILTER0 + texture_idx * 4); @@ -1102,14 +1099,21 @@ static void create_texture(PGRAPHState *pg, int texture_idx) pgraph_reg_r(pg, NV_PGRAPH_TEXADDRESS0 + texture_idx * 4); uint32_t border_color_pack32 = pgraph_reg_r(pg, NV_PGRAPH_BORDERCOLOR0 + texture_idx * 4); + bool is_indexed = (state.color_format == + NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8); TextureKey key; memset(&key, 0, sizeof(key)); key.state = state; key.texture_vram_offset = texture_vram_offset; key.texture_length = texture_length; - key.palette_vram_offset = texture_palette_vram_offset; - key.palette_length = texture_palette_data_size; + if (is_indexed) { + texture_palette_vram_offset = + pgraph_get_texture_palette_phys_addr_length( + pg, texture_idx, &texture_palette_data_size); + key.palette_vram_offset = texture_palette_vram_offset; + key.palette_length = texture_palette_data_size; + } key.scale = 1; // FIXME: Separate sampler from texture @@ -1117,9 +1121,6 @@ static void create_texture(PGRAPHState *pg, int texture_idx) key.address = address; key.border_color = border_color_pack32; - bool is_indexed = (state.color_format == - NV097_SET_TEXTURE_FORMAT_COLOR_SZ_I8_A8R8G8B8); - bool possibly_dirty = false; bool possibly_dirty_checked = false; bool surface_to_texture = false;