diff --git a/src/core/libraries/videoout/driver.cpp b/src/core/libraries/videoout/driver.cpp index fb7dffa39..6b74107a7 100644 --- a/src/core/libraries/videoout/driver.cpp +++ b/src/core/libraries/videoout/driver.cpp @@ -165,6 +165,9 @@ int VideoOutDriver::UnregisterBuffers(VideoOutPort* port, s32 attributeIndex) { } void VideoOutDriver::Flip(const Request& req) { + // Update HDR status before presenting. + presenter->SetHDR(req.port->is_hdr); + // Present the frame. presenter->Present(req.frame); diff --git a/src/core/libraries/videoout/driver.h b/src/core/libraries/videoout/driver.h index 3b0df43b9..e0eace791 100644 --- a/src/core/libraries/videoout/driver.h +++ b/src/core/libraries/videoout/driver.h @@ -34,7 +34,7 @@ struct VideoOutPort { int flip_rate = 0; int prev_index = -1; bool is_open = false; - bool is_mode_changing = false; // Used to prevent flip during mode change + bool is_hdr = false; s32 FindFreeGroup() const { s32 index = 0; diff --git a/src/core/libraries/videoout/video_out.cpp b/src/core/libraries/videoout/video_out.cpp index 8630cd2fc..ece2640c9 100644 --- a/src/core/libraries/videoout/video_out.cpp +++ b/src/core/libraries/videoout/video_out.cpp @@ -429,16 +429,17 @@ s32 PS4_SYSV_ABI sceVideoOutConfigureOutputMode_(s32 handle, u32 reserved, const return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE; } - if (mode->colorimetry != OrbisVideoOutColorimetry::Any) { - auto& game_info = Common::ElfInfo::Instance(); - if (mode->colorimetry == OrbisVideoOutColorimetry::Bt2020PQ && - game_info.GetPSFAttributes().support_hdr) { - port->is_mode_changing = true; - presenter->SetHDR(true); - port->is_mode_changing = false; - } else { - return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE; + switch (mode->colorimetry) { + case OrbisVideoOutColorimetry::Any: + port->is_hdr = false; + break; + case OrbisVideoOutColorimetry::Bt2020PQ: + if (Common::ElfInfo::Instance().GetPSFAttributes().support_hdr) { + port->is_hdr = true; } + break; + default: + return ORBIS_VIDEO_OUT_ERROR_INVALID_VALUE; } return ORBIS_OK;