mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 02:47:02 +02:00
Graphics: preserve rendered contents across 1D and 2D texture aliases
This commit is contained in:
@@ -8478,6 +8478,50 @@ public:
|
||||
{1, 1, 1}, 0, mip) == expected,
|
||||
"the sampled target lost its GPU-written final texel");
|
||||
}
|
||||
if (width == 1 && height == 1) {
|
||||
for (const bool uint_view : {true, false}) {
|
||||
descriptor.fields[1] = static_cast<uint32_t>(
|
||||
uint_view ? Prospero::BufferFormat::k16_16_16_16UInt
|
||||
: Prospero::BufferFormat::k16_16_16_16Float) << 20u;
|
||||
descriptor.fields[3] = 0x81b00facu; // Captured 1D view, tile27, RGBA swizzle.
|
||||
std::copy_n(descriptor.fields, 8, value.dwords.begin());
|
||||
resource.numeric_class = uint_view ? Prospero::TextureNumericClass::Uint
|
||||
: Prospero::TextureNumericClass::Float;
|
||||
resource.dimension = ShaderRecompiler::Decoder::ImageDimension::Dim1D;
|
||||
const auto one_d =
|
||||
RenderExecutorTestAccess::ResolveTexture(executor, resource, value);
|
||||
const auto one_d_view = texture_cache.FindTexture(one_d.image_id, one_d.desc);
|
||||
const auto repeated =
|
||||
RenderExecutorTestAccess::ResolveTexture(executor, resource, value);
|
||||
Require(name, "1D sampled backing and reuse",
|
||||
one_d.image_id != color.image_id && one_d_view != nullptr &&
|
||||
one_d.desc.view_info.type == vk::ImageViewType::e1D &&
|
||||
texture_cache.GetImage(one_d.image_id).backing.image_type ==
|
||||
vk::ImageType::e1D &&
|
||||
repeated.image_id == one_d.image_id &&
|
||||
texture_cache.FindTexture(repeated.image_id, repeated.desc) == one_d_view &&
|
||||
ReadCachedTexel(name, context, one_d.image_id) == expected,
|
||||
"the 1D alias reused an incompatible backing or lost the rendered texel");
|
||||
|
||||
RenderExecutorTestAccess::ResetBindings(executor);
|
||||
RenderExecutorTestAccess::ResolveRenderColorTarget(
|
||||
executor, scheduler.Current(), color, 0);
|
||||
const auto restored = RenderExecutorTestAccess::AcquireRenderTargets(
|
||||
executor, scheduler.Current(), &color, 1, no_depth);
|
||||
scheduler.Current().BeginRendering(restored);
|
||||
scheduler.Current().EndRendering();
|
||||
Require(name, "2D target restoration",
|
||||
color.image_id != one_d.image_id &&
|
||||
restored.color_attachments[0].image_view != nullptr &&
|
||||
texture_cache.GetImage(color.image_id).backing.image_type ==
|
||||
vk::ImageType::e2D &&
|
||||
texture_cache.GetImage(color.image_id).info.pixel_format ==
|
||||
vk::Format::eR16G16B16A16Sfloat &&
|
||||
ReadCachedTexel(name, context, color.image_id) == expected,
|
||||
"restoring the 2D target lost its view type or GPU-written texel");
|
||||
RenderExecutorTestAccess::ResetBindings(executor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RenderExecutorTestAccess::ResetBindings(executor);
|
||||
|
||||
Reference in New Issue
Block a user