From af2f2d54b6cc8650b2567d18b4733d5f301edb27 Mon Sep 17 00:00:00 2001 From: nmzik Date: Sat, 18 Jul 2026 08:37:38 +0200 Subject: [PATCH] add videoout DCC --- src/graphics/host_gpu/renderer/image.cpp | 3 ++- src/graphics/host_gpu/renderer/imageInfo.h | 23 ++++++++++++++++------ tests/ShaderRecompilerComputeTests.cpp | 8 ++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/graphics/host_gpu/renderer/image.cpp b/src/graphics/host_gpu/renderer/image.cpp index d3fdd395d..1cc21e331 100644 --- a/src/graphics/host_gpu/renderer/image.cpp +++ b/src/graphics/host_gpu/renderer/image.cpp @@ -300,7 +300,8 @@ void ValidateVideoOut(GraphicContext* ctx, const VideoOutInfo& info) { const auto compression = ClassifyVideoOutCompression(info.compression != VideoOutCompression::Uncompressed, info.metadata_address, info.dcc_control, 0); - const bool metadata_invalid = compression == VideoOutCompression::Dcc256_64_64 && + const bool metadata_invalid = compression != VideoOutCompression::Uncompressed && + compression != VideoOutCompression::Unsupported && (info.metadata_address >= TRACKER_ADDRESS_SIZE || (info.metadata_address >= info.address && info.metadata_address < info.address + info.size)); diff --git a/src/graphics/host_gpu/renderer/imageInfo.h b/src/graphics/host_gpu/renderer/imageInfo.h index 98c464eee..0ca5824fe 100644 --- a/src/graphics/host_gpu/renderer/imageInfo.h +++ b/src/graphics/host_gpu/renderer/imageInfo.h @@ -225,7 +225,12 @@ FindGuestDepthFormatPolicy(uint32_t guest_format) noexcept { : info.format == policy->depth_attachment_format); } -enum class VideoOutCompression : uint8_t { Uncompressed, Dcc256_64_64, Unsupported }; +enum class VideoOutCompression : uint8_t { + Uncompressed, + Dcc256_256_0, + Dcc256_64_64, + Unsupported +}; struct VideoOutInfo { uint64_t address = 0; @@ -246,22 +251,28 @@ struct VideoOutInfo { [[nodiscard]] inline VideoOutCompression ClassifyVideoOutCompression(bool compressed, uint64_t metadata_address, uint32_t dcc_control, uint64_t dcc_clear_color) noexcept { + constexpr uint32_t VIDEO_OUT_DCC_CONTROL_256_256_0 = 0x00000048u; constexpr uint32_t VIDEO_OUT_DCC_CONTROL_256_64_64 = 0x00000208u; if (!compressed) { return metadata_address == 0 && dcc_control == 0 && dcc_clear_color == 0 ? VideoOutCompression::Uncompressed : VideoOutCompression::Unsupported; } - return metadata_address != 0 && (metadata_address & 0xffu) == 0 && - dcc_control == VIDEO_OUT_DCC_CONTROL_256_64_64 && dcc_clear_color == 0 - ? VideoOutCompression::Dcc256_64_64 - : VideoOutCompression::Unsupported; + if (metadata_address == 0 || (metadata_address & 0xffu) != 0 || dcc_clear_color != 0) { + return VideoOutCompression::Unsupported; + } + switch (dcc_control) { + case VIDEO_OUT_DCC_CONTROL_256_256_0: return VideoOutCompression::Dcc256_256_0; + case VIDEO_OUT_DCC_CONTROL_256_64_64: return VideoOutCompression::Dcc256_64_64; + default: return VideoOutCompression::Unsupported; + } } [[nodiscard]] inline constexpr bool CanUseVideoOutNativeWithoutUpload(VideoOutCompression compression, bool render_target, bool gpu_modified, bool guest_modified) noexcept { - return compression == VideoOutCompression::Dcc256_64_64 && !guest_modified && + return compression != VideoOutCompression::Uncompressed && + compression != VideoOutCompression::Unsupported && !guest_modified && (render_target || gpu_modified); } diff --git a/tests/ShaderRecompilerComputeTests.cpp b/tests/ShaderRecompilerComputeTests.cpp index f5ac01225..9738aca0f 100644 --- a/tests/ShaderRecompilerComputeTests.cpp +++ b/tests/ShaderRecompilerComputeTests.cpp @@ -11945,6 +11945,10 @@ void CheckImageOverlapResolution() { "host-backed fill aliased a sampled image on another page"); constexpr uint64_t video_metadata = 0x1020c10000ull; + Require("ImageOverlapResolution", "video-out DCC 256/256/0", + ClassifyVideoOutCompression(true, video_metadata, 0x48u, 0) == + VideoOutCompression::Dcc256_256_0, + "Prospero video-out DCC 256/256/0 mode was rejected"); Require("ImageOverlapResolution", "video-out DCC 256/64/64", ClassifyVideoOutCompression(true, video_metadata, 0x208u, 0) == VideoOutCompression::Dcc256_64_64, @@ -11970,6 +11974,10 @@ void CheckImageOverlapResolution() { VideoOutCompression::Dcc256_64_64, false, true, false) && !CanUseVideoOutNativeWithoutUpload( VideoOutCompression::Dcc256_64_64, false, false, false) && + CanUseVideoOutNativeWithoutUpload( + VideoOutCompression::Dcc256_256_0, true, false, false) && + !CanUseVideoOutNativeWithoutUpload( + VideoOutCompression::Dcc256_256_0, false, false, true) && !CanUseVideoOutNativeWithoutUpload( VideoOutCompression::Dcc256_64_64, true, false, true) && !CanUseVideoOutNativeWithoutUpload(