1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 16:29:16 +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( HRESULT STDMETHODCALLTYPE D3D11SwapChain::SetHDRMetaData(
const DXGI_VK_HDR_METADATA* pMetaData) { const DXGI_VK_HDR_METADATA* pMetaData) {
// For some reason this call always seems to succeed on Windows // For some reason this call always seems to succeed on Windows
if (pMetaData->Type == DXGI_HDR_METADATA_TYPE_HDR10) { if (pMetaData->Type == DXGI_HDR_METADATA_TYPE_HDR10)
m_hdrMetadata = ConvertHDRMetadata(pMetaData->HDR10); m_presenter->setHdrMetadata(ConvertHDRMetadata(pMetaData->HDR10));
m_dirtyHdrMetadata = true;
}
return S_OK; return S_OK;
} }
@ -402,11 +400,6 @@ namespace dxvk {
break; break;
} }
if (m_hdrMetadata && m_dirtyHdrMetadata) {
m_presenter->setHdrMetadata(*m_hdrMetadata);
m_dirtyHdrMetadata = false;
}
m_frameId += 1; m_frameId += 1;
// Present from CS thread so that we don't // Present from CS thread so that we don't
@ -501,7 +494,6 @@ namespace dxvk {
m_device->waitForIdle(); m_device->waitForIdle();
m_presentStatus.result = VK_SUCCESS; m_presentStatus.result = VK_SUCCESS;
m_dirtyHdrMetadata = true;
PresenterDesc presenterDesc; PresenterDesc presenterDesc;
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height }; 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; VkColorSpaceKHR m_colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
bool m_dirtyHdrMetadata = true;
double m_targetFrameRate = 0.0; double m_targetFrameRate = 0.0;
dxvk::mutex m_frameStatisticsLock; dxvk::mutex m_frameStatisticsLock;

View File

@ -73,6 +73,17 @@ namespace dxvk {
if (m_acquireStatus != VK_SUCCESS && m_acquireStatus != VK_SUBOPTIMAL_KHR) if (m_acquireStatus != VK_SUCCESS && m_acquireStatus != VK_SUBOPTIMAL_KHR)
return m_acquireStatus; 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); image = m_images.at(m_imageIndex);
return m_acquireStatus; return m_acquireStatus;
} }
@ -415,6 +426,8 @@ namespace dxvk {
} }
// Invalidate indices // Invalidate indices
m_hdrMetadataDirty = true;
m_imageIndex = 0; m_imageIndex = 0;
m_frameIndex = 0; m_frameIndex = 0;
m_acquireStatus = VK_NOT_READY; m_acquireStatus = VK_NOT_READY;
@ -464,8 +477,18 @@ namespace dxvk {
void Presenter::setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata) { void Presenter::setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata) {
if (m_device->features().extHdrMetadata) if (m_hdrMetadata->sType != VK_STRUCTURE_TYPE_HDR_METADATA_EXT) {
m_vkd->vkSetHdrMetadataEXT(m_vkd->device(), 1, &m_swapchain, &hdrMetadata); 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 #pragma once
#include <functional> #include <functional>
#include <optional>
#include <queue> #include <queue>
#include <vector> #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 * \param [in] colorspace The color space to test
* * \returns \c true if the presenter supports the colorspace * \returns \c true if the Vulkan surface supports the colorspace
*/ */
bool supportsColorSpace(VkColorSpaceKHR colorspace); bool supportsColorSpace(VkColorSpaceKHR colorspace);
/** /**
* \brief Sets HDR metadata * \brief Sets HDR metadata
* *
* Updated HDR metadata will be applied on the next \c acquire.
* \param [in] hdrMetadata HDR Metadata * \param [in] hdrMetadata HDR Metadata
*/ */
void setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata); void setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata);
@ -230,6 +232,9 @@ namespace dxvk {
VkResult m_acquireStatus = VK_NOT_READY; VkResult m_acquireStatus = VK_NOT_READY;
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
bool m_hdrMetadataDirty = false;
alignas(CACHE_LINE_SIZE) alignas(CACHE_LINE_SIZE)
dxvk::mutex m_frameMutex; dxvk::mutex m_frameMutex;
dxvk::condition_variable m_frameCond; dxvk::condition_variable m_frameCond;