1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-13 19:29:14 +01:00

[dxvk] Rework HDR metadata updates

This commit is contained in:
Philip Rebohle 2025-01-12 19:25:07 +01:00 committed by Philip Rebohle
parent 63e88debee
commit 06b44c6237
4 changed files with 36 additions and 19 deletions

View File

@ -322,10 +322,8 @@ namespace dxvk {
HRESULT STDMETHODCALLTYPE D3D11SwapChain::SetHDRMetaData(
const DXGI_VK_HDR_METADATA* pMetaData) {
// For some reason this call always seems to succeed on Windows
if (pMetaData->Type == DXGI_HDR_METADATA_TYPE_HDR10) {
m_hdrMetadata = ConvertHDRMetadata(pMetaData->HDR10);
m_dirtyHdrMetadata = true;
}
if (pMetaData->Type == DXGI_HDR_METADATA_TYPE_HDR10)
m_presenter->setHdrMetadata(ConvertHDRMetadata(pMetaData->HDR10));
return S_OK;
}
@ -402,11 +400,6 @@ namespace dxvk {
break;
}
if (m_hdrMetadata && m_dirtyHdrMetadata) {
m_presenter->setHdrMetadata(*m_hdrMetadata);
m_dirtyHdrMetadata = false;
}
m_frameId += 1;
// Present from CS thread so that we don't
@ -501,7 +494,6 @@ namespace dxvk {
m_device->waitForIdle();
m_presentStatus.result = VK_SUCCESS;
m_dirtyHdrMetadata = true;
PresenterDesc presenterDesc;
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height };

View File

@ -123,9 +123,6 @@ namespace dxvk {
VkColorSpaceKHR m_colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
bool m_dirtyHdrMetadata = true;
double m_targetFrameRate = 0.0;
dxvk::mutex m_frameStatisticsLock;

View File

@ -72,7 +72,18 @@ namespace dxvk {
if (m_acquireStatus != VK_SUCCESS && m_acquireStatus != VK_SUBOPTIMAL_KHR)
return m_acquireStatus;
// Update HDR metadata after a successful acquire. We know
// that there won't be a present in flight at this point.
if (m_hdrMetadataDirty && m_hdrMetadata) {
m_hdrMetadataDirty = false;
if (m_device->features().extHdrMetadata) {
m_vkd->vkSetHdrMetadataEXT(m_vkd->device(),
1, &m_swapchain, &(*m_hdrMetadata));
}
}
image = m_images.at(m_imageIndex);
return m_acquireStatus;
}
@ -415,6 +426,8 @@ namespace dxvk {
}
// Invalidate indices
m_hdrMetadataDirty = true;
m_imageIndex = 0;
m_frameIndex = 0;
m_acquireStatus = VK_NOT_READY;
@ -464,8 +477,18 @@ namespace dxvk {
void Presenter::setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata) {
if (m_device->features().extHdrMetadata)
m_vkd->vkSetHdrMetadataEXT(m_vkd->device(), 1, &m_swapchain, &hdrMetadata);
if (m_hdrMetadata->sType != VK_STRUCTURE_TYPE_HDR_METADATA_EXT) {
m_hdrMetadata = std::nullopt;
return;
}
if (hdrMetadata.pNext)
Logger::warn("HDR metadata extensions not currently supported.");
m_hdrMetadata = hdrMetadata;
m_hdrMetadata->pNext = nullptr;
m_hdrMetadataDirty = true;
}

View File

@ -1,6 +1,7 @@
#pragma once
#include <functional>
#include <optional>
#include <queue>
#include <vector>
@ -190,16 +191,17 @@ namespace dxvk {
}
/**
* \brief Checks if a presenter supports the colorspace
* \brief Checks support for a Vulkan color space
*
* \param [in] colorspace The colorspace to test
* * \returns \c true if the presenter supports the colorspace
* \param [in] colorspace The color space to test
* \returns \c true if the Vulkan surface supports the colorspace
*/
bool supportsColorSpace(VkColorSpaceKHR colorspace);
/**
* \brief Sets HDR metadata
*
* Updated HDR metadata will be applied on the next \c acquire.
* \param [in] hdrMetadata HDR Metadata
*/
void setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata);
@ -230,6 +232,9 @@ namespace dxvk {
VkResult m_acquireStatus = VK_NOT_READY;
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
bool m_hdrMetadataDirty = false;
alignas(CACHE_LINE_SIZE)
dxvk::mutex m_frameMutex;
dxvk::condition_variable m_frameCond;