gpu: keep 2D and 3D texture aliases separate

Co-authored-by: Çağatay Güçlü <33038942+defektu@users.noreply.github.com>
This commit is contained in:
nmzik 2026-10-05 00:04:46 +04:00
parent a98a39c575
commit 0885f43a6a
2 changed files with 45 additions and 1 deletions

View File

@ -844,6 +844,9 @@ TextureCache::OverlapResult TextureCache::ResolveOverlap(const ImageInfo& reques
requested.resources.layers == cached.info.resources.layers))) {
return {ExpandImage(requested, cached_id)};
}
if (requested.type != cached.info.type) {
return {merged_id};
}
if (requested.pixel_format != cached.info.pixel_format ||
requested.data.size <= cached.info.data.size) {
const auto result_id = merged_id ? merged_id : cached_id;

View File

@ -11647,7 +11647,7 @@ public:
constexpr uint64_t buffer_address = base + allocation_size - 0x5000;
ShaderBufferResource buffer_descriptor{};
buffer_descriptor.UpdateAddress48(buffer_address);
buffer_descriptor.fields[2] = 0x8000;
buffer_descriptor.fields[2] = 0x40000000; // Only oversized descriptors are clamped.
ShaderRecompiler::IR::ResourceSnapshot buffer_snapshot;
ShaderStageRuntime buffer_runtime{&buffer_program, &buffer_snapshot};
auto &value = buffer_snapshot.buffers.emplace_back();
@ -11784,6 +11784,47 @@ public:
DestroyBuffer(&output);
}
for (const bool volume_first : {false, true}) {
// PPSA24156 shares a six-face R8 allocation with a smaller 3D placeholder.
const auto address = base + 0xe30000 + volume_first * 0x10000;
auto array_desc = MakeLinearDesc(address, 1536, vk::Format::eR8Unorm,
Prospero::BufferFormat::k8UNorm, Prospero::ImageType::kColor2D,
{1, 1, 1}, 6, 1, 1);
array_desc.info.pitch = 256;
array_desc.info.mip_layout[0] = {0, 1536, 256, 1};
auto volume_desc = array_desc;
volume_desc.info.type = Prospero::ImageType::kColor3D;
volume_desc.info.data.size = 256;
volume_desc.info.resources.layers = 1;
volume_desc.info.mip_layout[0].size = 256;
volume_desc.view_info.type = vk::ImageViewType::e3D;
volume_desc.view_info.layer_count = 1;
const auto first_id = texture_cache.FindImage(volume_first ? volume_desc : array_desc);
const auto second_id = texture_cache.FindImage(volume_first ? array_desc : volume_desc);
const auto array_id = volume_first ? second_id : first_id;
const auto volume_id = volume_first ? first_id : second_id;
Require(name, "smaller volume native image", volume_id != array_id &&
texture_cache.GetImage(volume_id).backing.image_type == vk::ImageType::e3D,
"a smaller 3D descriptor reused the six-layer 2D owner");
(void)texture_cache.FindTexture(array_id, array_desc);
(void)texture_cache.FindTexture(volume_id, volume_desc);
Require(name, "retained dimensional aliases",
texture_cache.FindImage(array_desc) == array_id &&
texture_cache.FindImage(volume_desc) == volume_id &&
texture_cache.GetImage(array_id).info.resources.layers == 6,
"dimensional alias lookup discarded the array owner or lost its faces");
auto subarray_desc = array_desc;
subarray_desc.info.data.size = 1280;
subarray_desc.info.resources.layers = 5;
subarray_desc.info.mip_layout[0].size = 1280;
subarray_desc.view_info.layer_count = 5;
const auto subarray_id = texture_cache.FindImage(subarray_desc);
Require(name, "preserved dimensional overlap selection", subarray_id == array_id &&
texture_cache.GetImage(array_id).info.resources.layers == 6,
"a smaller volume alias displaced the selected array owner");
(void)texture_cache.FindTexture(subarray_id, subarray_desc);
}
constexpr auto stencil_format = Prospero::BufferFormat::k8UInt;
constexpr auto linear = Prospero::TileMode::kLinear;
TileSizeAlign stencil_layout{};