mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-21 03:16:54 +02:00
graphics: support depth targets with read-only backing
This commit is contained in:
@@ -561,9 +561,10 @@ static void ZCheck(const HW::DepthRenderTarget& z, const HW::DepthControl& dc,
|
|||||||
z.depth_view.stencil_write_disable ? "true" : "false");
|
z.depth_view.stencil_write_disable ? "true" : "false");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXIT_NOT_IMPLEMENTED(z.z_read_base_addr != z.z_write_base_addr);
|
EXIT_NOT_IMPLEMENTED(!z.depth_view.depth_write_disable &&
|
||||||
|
z.z_read_base_addr != z.z_write_base_addr);
|
||||||
EXIT_NOT_IMPLEMENTED(z.stencil_read_base_addr != z.stencil_write_base_addr);
|
EXIT_NOT_IMPLEMENTED(z.stencil_read_base_addr != z.stencil_write_base_addr);
|
||||||
EXIT_NOT_IMPLEMENTED(z.z_write_base_addr == 0);
|
EXIT_NOT_IMPLEMENTED(!z.depth_view.depth_write_disable && z.z_write_base_addr == 0);
|
||||||
if (z.stencil_info.format != Prospero::StencilFormat::kInvalid &&
|
if (z.stencil_info.format != Prospero::StencilFormat::kInvalid &&
|
||||||
z.stencil_write_base_addr == 0) {
|
z.stencil_write_base_addr == 0) {
|
||||||
LOGF("\t warning: stencil format is set without a stencil base address, continuing "
|
LOGF("\t warning: stencil format is set without a stencil base address, continuing "
|
||||||
|
|||||||
@@ -177,7 +177,8 @@ void RenderExecutor::ResolveRenderDepthTarget(uint64_t submit_id, RenderCommandB
|
|||||||
z.htile_surface.htile_uses_preload_win != 0 || z.htile_surface.preload != 0 ||
|
z.htile_surface.htile_uses_preload_win != 0 || z.htile_surface.preload != 0 ||
|
||||||
z.htile_surface.prefetch_width != 0 || z.htile_surface.prefetch_height != 0 ||
|
z.htile_surface.prefetch_width != 0 || z.htile_surface.prefetch_height != 0 ||
|
||||||
z.htile_surface.dst_outside_zero_to_one != 0 || z.z_read_base_addr == 0 ||
|
z.htile_surface.dst_outside_zero_to_one != 0 || z.z_read_base_addr == 0 ||
|
||||||
z.z_write_base_addr != z.z_read_base_addr || (z.z_read_base_addr & 0xffffu) != 0 ||
|
(!z.depth_view.depth_write_disable && z.z_write_base_addr != z.z_read_base_addr) ||
|
||||||
|
(z.z_read_base_addr & 0xffffu) != 0 ||
|
||||||
dc.zfunc > static_cast<uint8_t>(vk::CompareOp::eAlways)) {
|
dc.zfunc > static_cast<uint8_t>(vk::CompareOp::eAlways)) {
|
||||||
DepthFatal("unsupported depth register state");
|
DepthFatal("unsupported depth register state");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7491,7 +7491,30 @@ public:
|
|||||||
!texture_cache.GetImage(phased_depth.image_id).usage.depth_target,
|
!texture_cache.GetImage(phased_depth.image_id).usage.depth_target,
|
||||||
"valid PS5 texture-compatibility policy changed logical depth image "
|
"valid PS5 texture-compatibility policy changed logical depth image "
|
||||||
"identity or discovery side effects");
|
"identity or discovery side effects");
|
||||||
|
|
||||||
|
auto read_only_depth_target = phased_depth_target;
|
||||||
|
read_only_depth_target.z_write_base_addr = 0;
|
||||||
|
read_only_depth_target.depth_view.depth_write_disable = true;
|
||||||
|
registers.SetDepthRenderTarget(read_only_depth_target);
|
||||||
|
auto read_only_depth_control = phased_depth_control;
|
||||||
|
read_only_depth_control.z_write_enable = false;
|
||||||
|
registers.SetDepthControl(read_only_depth_control);
|
||||||
|
RenderDepthInfo read_only_depth{};
|
||||||
|
RenderExecutorTestAccess::ResolveRenderDepthTarget(
|
||||||
|
executor, 1, scheduler.Current(), read_only_depth);
|
||||||
|
Require(
|
||||||
|
name, "read-only depth target without write address",
|
||||||
|
read_only_depth.image_id == phased_depth.image_id &&
|
||||||
|
read_only_depth.depth_buffer_vaddr == phased_depth_address &&
|
||||||
|
!read_only_depth.depth_write_enable &&
|
||||||
|
!read_only_depth.AttachmentWriteAspects() &&
|
||||||
|
depth_attachment_layout(read_only_depth) ==
|
||||||
|
vk::ImageLayout::eDepthStencilReadOnlyOptimal,
|
||||||
|
"a PS5 read-only depth target required a depth write address or "
|
||||||
|
"selected a writable host layout");
|
||||||
|
|
||||||
registers.SetDepthRenderTarget(phased_depth_target);
|
registers.SetDepthRenderTarget(phased_depth_target);
|
||||||
|
registers.SetDepthControl(phased_depth_control);
|
||||||
RenderColorInfo no_color{};
|
RenderColorInfo no_color{};
|
||||||
auto phased_rendering = RenderExecutorTestAccess::AcquireRenderTargets(
|
auto phased_rendering = RenderExecutorTestAccess::AcquireRenderTargets(
|
||||||
executor, scheduler.Current(), &no_color, 0, phased_depth);
|
executor, scheduler.Current(), &no_color, 0, phased_depth);
|
||||||
|
|||||||
Reference in New Issue
Block a user