add videoout DCC

This commit is contained in:
nmzik
2026-07-18 08:37:38 +02:00
parent 387f9e3cde
commit af2f2d54b6
3 changed files with 27 additions and 7 deletions
+2 -1
View File
@@ -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));
+17 -6
View File
@@ -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);
}
+8
View File
@@ -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(