rhi: Expose HDR output info in a saner way
Don't bother with exposing the IDXGIOutput6. Instead, report the values, just the ones that matter for tonemapping or transfer functions in a cross-platform way that's also prepared for Metal's different way of doing things. Change-Id: I28c7b6144f8267a9d3d44eff1e40697fb543385f Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
parent
abe802cd00
commit
8efe2d54b7
@ -4465,18 +4465,37 @@ QRhiResource::Type QRhiSwapChain::resourceType() const
|
|||||||
Regardless of the return value, calling destroy() is always safe.
|
Regardless of the return value, calling destroy() is always safe.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
QRhiSwapChainHdrInfo QRhiSwapChain::hdrInfo()
|
||||||
\return a pointer to a backend-specific QRhiNativeHandles subclass, such as
|
|
||||||
QRhiD3D11SwapChainNativeHandles. The returned value is \nullptr when
|
|
||||||
exposing the underlying native resources is not supported by the backend.
|
|
||||||
|
|
||||||
\sa QRhiD3D11SwapChainNativeHandles
|
|
||||||
*/
|
|
||||||
const QRhiNativeHandles *QRhiSwapChain::nativeHandles()
|
|
||||||
{
|
{
|
||||||
return nullptr;
|
QRhiSwapChainHdrInfo info;
|
||||||
|
info.isHardCodedDefaults = true;
|
||||||
|
info.limitsType = QRhiSwapChainHdrInfo::LuminanceInNits;
|
||||||
|
info.limits.luminanceInNits.minLuminance = 0.0f;
|
||||||
|
info.limits.luminanceInNits.maxLuminance = 1000.0f;
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
|
QDebug operator<<(QDebug dbg, const QRhiSwapChainHdrInfo &info)
|
||||||
|
{
|
||||||
|
QDebugStateSaver saver(dbg);
|
||||||
|
dbg.nospace() << "QRhiSwapChainHdrInfo(" << (info.isHardCodedDefaults ? "with hard-coded defaults" : "queried from system");
|
||||||
|
switch (info.limitsType) {
|
||||||
|
case QRhiSwapChainHdrInfo::LuminanceInNits:
|
||||||
|
dbg.nospace() << " minLuminance=" << info.limits.luminanceInNits.minLuminance
|
||||||
|
<< " maxLuminance=" << info.limits.luminanceInNits.maxLuminance;
|
||||||
|
break;
|
||||||
|
case QRhiSwapChainHdrInfo::ColorComponentValue:
|
||||||
|
dbg.nospace() << " maxColorComponentValue=" << info.limits.colorComponentValue.maxColorComponentValue;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
dbg.nospace() << ')';
|
||||||
|
return dbg;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class QRhiComputePipeline
|
\class QRhiComputePipeline
|
||||||
\internal
|
\internal
|
||||||
|
@ -1313,6 +1313,31 @@ Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiGraphicsPipeline::Flags)
|
|||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiGraphicsPipeline::ColorMask)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(QRhiGraphicsPipeline::ColorMask)
|
||||||
Q_DECLARE_TYPEINFO(QRhiGraphicsPipeline::TargetBlend, Q_RELOCATABLE_TYPE);
|
Q_DECLARE_TYPEINFO(QRhiGraphicsPipeline::TargetBlend, Q_RELOCATABLE_TYPE);
|
||||||
|
|
||||||
|
struct QRhiSwapChainHdrInfo
|
||||||
|
{
|
||||||
|
bool isHardCodedDefaults;
|
||||||
|
enum LimitsType {
|
||||||
|
LuminanceInNits,
|
||||||
|
ColorComponentValue
|
||||||
|
};
|
||||||
|
LimitsType limitsType;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
float minLuminance;
|
||||||
|
float maxLuminance;
|
||||||
|
} luminanceInNits;
|
||||||
|
struct {
|
||||||
|
float maxColorComponentValue;
|
||||||
|
} colorComponentValue;
|
||||||
|
} limits;
|
||||||
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_TYPEINFO(QRhiSwapChainHdrInfo, Q_RELOCATABLE_TYPE);
|
||||||
|
|
||||||
|
#ifndef QT_NO_DEBUG_STREAM
|
||||||
|
Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiSwapChainHdrInfo &);
|
||||||
|
#endif
|
||||||
|
|
||||||
class Q_GUI_EXPORT QRhiSwapChain : public QRhiResource
|
class Q_GUI_EXPORT QRhiSwapChain : public QRhiResource
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -1360,8 +1385,7 @@ public:
|
|||||||
virtual bool isFormatSupported(Format f) = 0;
|
virtual bool isFormatSupported(Format f) = 0;
|
||||||
virtual QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() = 0;
|
virtual QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() = 0;
|
||||||
virtual bool createOrResize() = 0;
|
virtual bool createOrResize() = 0;
|
||||||
|
virtual QRhiSwapChainHdrInfo hdrInfo();
|
||||||
virtual const QRhiNativeHandles *nativeHandles();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QRhiSwapChain(QRhiImplementation *rhi);
|
QRhiSwapChain(QRhiImplementation *rhi);
|
||||||
|
@ -115,18 +115,6 @@ QT_BEGIN_NAMESPACE
|
|||||||
\c{ID3D11Device *} and \c{ID3D11DeviceContext *}.
|
\c{ID3D11Device *} and \c{ID3D11DeviceContext *}.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
|
||||||
\class QRhiD3D11SwapChainNativeHandles
|
|
||||||
\internal
|
|
||||||
\inmodule QtGui
|
|
||||||
\brief Exposes D3D/DXGI specific data for a swapchain
|
|
||||||
|
|
||||||
dxgiOutput6 is the IDXGIOutput6* for the swapchain's current output, if
|
|
||||||
supported, null otherwise. The current output is determined based on the
|
|
||||||
position of the swapchain's associated window at the time of calling
|
|
||||||
QRhiSwapChain::createOrResize().
|
|
||||||
*/
|
|
||||||
|
|
||||||
// help mingw with its ancient sdk headers
|
// help mingw with its ancient sdk headers
|
||||||
#ifndef DXGI_ADAPTER_FLAG_SOFTWARE
|
#ifndef DXGI_ADAPTER_FLAG_SOFTWARE
|
||||||
#define DXGI_ADAPTER_FLAG_SOFTWARE 2
|
#define DXGI_ADAPTER_FLAG_SOFTWARE 2
|
||||||
@ -4376,11 +4364,6 @@ void QD3D11SwapChain::destroy()
|
|||||||
swapChain->Release();
|
swapChain->Release();
|
||||||
swapChain = nullptr;
|
swapChain = nullptr;
|
||||||
|
|
||||||
if (output6) {
|
|
||||||
output6->Release();
|
|
||||||
output6 = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
QRHI_RES_RHI(QRhiD3D11);
|
QRHI_RES_RHI(QRhiD3D11);
|
||||||
if (rhiD)
|
if (rhiD)
|
||||||
rhiD->unregisterResource(this);
|
rhiD->unregisterResource(this);
|
||||||
@ -4458,6 +4441,22 @@ bool QD3D11SwapChain::isFormatSupported(Format f)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRhiSwapChainHdrInfo QD3D11SwapChain::hdrInfo()
|
||||||
|
{
|
||||||
|
QRhiSwapChainHdrInfo info = QRhiSwapChain::hdrInfo();
|
||||||
|
if (m_format != QRhiSwapChain::SDR && m_window) {
|
||||||
|
QRHI_RES_RHI(QRhiD3D11);
|
||||||
|
DXGI_OUTPUT_DESC1 hdrOutputDesc;
|
||||||
|
if (outputDesc1ForWindow(m_window, rhiD->activeAdapter, &hdrOutputDesc)) {
|
||||||
|
info.isHardCodedDefaults = false;
|
||||||
|
info.limitsType = QRhiSwapChainHdrInfo::LuminanceInNits;
|
||||||
|
info.limits.luminanceInNits.minLuminance = hdrOutputDesc.MinLuminance;
|
||||||
|
info.limits.luminanceInNits.maxLuminance = hdrOutputDesc.MaxLuminance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
QRhiRenderPassDescriptor *QD3D11SwapChain::newCompatibleRenderPassDescriptor()
|
QRhiRenderPassDescriptor *QD3D11SwapChain::newCompatibleRenderPassDescriptor()
|
||||||
{
|
{
|
||||||
return new QD3D11RenderPassDescriptor(m_rhi);
|
return new QD3D11RenderPassDescriptor(m_rhi);
|
||||||
@ -4546,13 +4545,9 @@ bool QD3D11SwapChain::createOrResize()
|
|||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
if (useFlipDiscard) {
|
if (useFlipDiscard) {
|
||||||
DXGI_COLOR_SPACE_TYPE hdrColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; // SDR
|
DXGI_COLOR_SPACE_TYPE hdrColorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709; // SDR
|
||||||
if (output6) {
|
DXGI_OUTPUT_DESC1 hdrOutputDesc;
|
||||||
output6->Release();
|
if (outputDesc1ForWindow(m_window, rhiD->activeAdapter, &hdrOutputDesc) && m_format != SDR) {
|
||||||
output6 = nullptr;
|
|
||||||
}
|
|
||||||
if (output6ForWindow(m_window, rhiD->activeAdapter, &output6) && m_format != SDR) {
|
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/direct3darticles/high-dynamic-range
|
// https://docs.microsoft.com/en-us/windows/win32/direct3darticles/high-dynamic-range
|
||||||
output6->GetDesc1(&hdrOutputDesc);
|
|
||||||
if (hdrOutputDesc.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020) {
|
if (hdrOutputDesc.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020) {
|
||||||
switch (m_format) {
|
switch (m_format) {
|
||||||
case HDRExtendedSrgbLinear:
|
case HDRExtendedSrgbLinear:
|
||||||
@ -4767,12 +4762,6 @@ bool QD3D11SwapChain::createOrResize()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QRhiNativeHandles *QD3D11SwapChain::nativeHandles()
|
|
||||||
{
|
|
||||||
nativeHandlesStruct.dxgiOutput6 = output6;
|
|
||||||
return &nativeHandlesStruct;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QRhiD3D11::DeviceCurse::initResources()
|
void QRhiD3D11::DeviceCurse::initResources()
|
||||||
{
|
{
|
||||||
framesLeft = framesToActivate;
|
framesLeft = framesToActivate;
|
||||||
|
@ -76,11 +76,6 @@ struct Q_GUI_EXPORT QRhiD3D11NativeHandles : public QRhiNativeHandles
|
|||||||
qint32 adapterLuidHigh = 0;
|
qint32 adapterLuidHigh = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Q_GUI_EXPORT QRhiD3D11SwapChainNativeHandles : public QRhiNativeHandles
|
|
||||||
{
|
|
||||||
void *dxgiOutput6 = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -560,10 +560,10 @@ struct QD3D11SwapChain : public QRhiSwapChain
|
|||||||
|
|
||||||
QSize surfacePixelSize() override;
|
QSize surfacePixelSize() override;
|
||||||
bool isFormatSupported(Format f) override;
|
bool isFormatSupported(Format f) override;
|
||||||
|
QRhiSwapChainHdrInfo hdrInfo() override;
|
||||||
|
|
||||||
QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
|
QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
|
||||||
bool createOrResize() override;
|
bool createOrResize() override;
|
||||||
const QRhiNativeHandles *nativeHandles() override;
|
|
||||||
|
|
||||||
void releaseBuffers();
|
void releaseBuffers();
|
||||||
bool newColorBuffer(const QSize &size, DXGI_FORMAT format, DXGI_SAMPLE_DESC sampleDesc,
|
bool newColorBuffer(const QSize &size, DXGI_FORMAT format, DXGI_SAMPLE_DESC sampleDesc,
|
||||||
@ -589,9 +589,6 @@ struct QD3D11SwapChain : public QRhiSwapChain
|
|||||||
ID3D11Query *timestampDisjointQuery[BUFFER_COUNT];
|
ID3D11Query *timestampDisjointQuery[BUFFER_COUNT];
|
||||||
ID3D11Query *timestampQuery[BUFFER_COUNT * 2];
|
ID3D11Query *timestampQuery[BUFFER_COUNT * 2];
|
||||||
UINT swapInterval = 1;
|
UINT swapInterval = 1;
|
||||||
IDXGIOutput6 *output6 = nullptr;
|
|
||||||
DXGI_OUTPUT_DESC1 hdrOutputDesc;
|
|
||||||
QRhiD3D11SwapChainNativeHandles nativeHandlesStruct;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class QRhiD3D11 : public QRhiImplementation
|
class QRhiD3D11 : public QRhiImplementation
|
||||||
|
Loading…
Reference in New Issue
Block a user