Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
QD3D11SwapChain Struct Reference

#include <qrhid3d11_p.h>

+ Inheritance diagram for QD3D11SwapChain:
+ Collaboration diagram for QD3D11SwapChain:

Public Member Functions

 QD3D11SwapChain (QRhiImplementation *rhi)
 
 ~QD3D11SwapChain ()
 
void destroy () override
 Releases (or requests deferred releasing of) the underlying native graphics resources.
 
QRhiCommandBuffercurrentFrameCommandBuffer () override
 
QRhiRenderTargetcurrentFrameRenderTarget () override
 
QSize surfacePixelSize () override
 
bool isFormatSupported (Format f) override
 
QRhiSwapChainHdrInfo hdrInfo () override
 \variable QRhiSwapChainHdrInfo::isHardCodedDefaults
 
QRhiRenderPassDescriptornewCompatibleRenderPassDescriptor () override
 
bool createOrResize () override
 Creates the swapchain if not already done and resizes the swapchain buffers to match the current size of the targeted surface.
 
void releaseBuffers ()
 
bool newColorBuffer (const QSize &size, DXGI_FORMAT format, DXGI_SAMPLE_DESC sampleDesc, ID3D11Texture2D **tex, ID3D11RenderTargetView **rtv) const
 
- Public Member Functions inherited from QRhiSwapChain
QRhiResource::Type resourceType () const override
 
QWindowwindow () const
 
void setWindow (QWindow *window)
 Sets the window.
 
QRhiSwapChainProxyData proxyData () const
 
void setProxyData (const QRhiSwapChainProxyData &d)
 Sets the proxy data d.
 
Flags flags () const
 
void setFlags (Flags f)
 Sets the flags f.
 
Format format () const
 
void setFormat (Format f)
 Sets the format f.
 
QRhiRenderBufferdepthStencil () const
 
void setDepthStencil (QRhiRenderBuffer *ds)
 Sets the renderbuffer ds for use as a depth-stencil buffer.
 
int sampleCount () const
 
void setSampleCount (int samples)
 Sets the sample count.
 
QRhiRenderPassDescriptorrenderPassDescriptor () const
 
void setRenderPassDescriptor (QRhiRenderPassDescriptor *desc)
 Associates with the QRhiRenderPassDescriptor desc.
 
QSize currentPixelSize () const
 
virtual QRhiCommandBuffercurrentFrameCommandBuffer ()=0
 
virtual QRhiRenderTargetcurrentFrameRenderTarget ()=0
 
virtual QRhiRenderTargetcurrentFrameRenderTarget (StereoTargetBuffer targetBuffer)
 
virtual QSize surfacePixelSize ()=0
 
virtual bool isFormatSupported (Format f)=0
 
virtual QRhiRenderPassDescriptornewCompatibleRenderPassDescriptor ()=0
 
virtual bool createOrResize ()=0
 Creates the swapchain if not already done and resizes the swapchain buffers to match the current size of the targeted surface.
 
virtual QRhiSwapChainHdrInfo hdrInfo ()
 \variable QRhiSwapChainHdrInfo::isHardCodedDefaults
 
- Public Member Functions inherited from QRhiResource
virtual ~QRhiResource ()
 Destructor.
 
virtual Type resourceType () const =0
 
virtual void destroy ()=0
 Releases (or requests deferred releasing of) the underlying native graphics resources.
 
void deleteLater ()
 When called without a frame being recorded, this function is equivalent to deleting the object.
 
QByteArray name () const
 
void setName (const QByteArray &name)
 Sets a name for the object.
 
quint64 globalResourceId () const
 
QRhirhi () const
 

Public Attributes

QWindowwindow = nullptr
 
QSize pixelSize
 
QD3D11SwapChainRenderTarget rt
 
QD3D11CommandBuffer cb
 
DXGI_FORMAT colorFormat
 
DXGI_FORMAT srgbAdjustedColorFormat
 
IDXGISwapChain * swapChain = nullptr
 
UINT swapChainFlags = 0
 
ID3D11Texture2D * backBufferTex
 
ID3D11RenderTargetView * backBufferRtv
 
ID3D11Texture2D * msaaTex [BUFFER_COUNT]
 
ID3D11RenderTargetView * msaaRtv [BUFFER_COUNT]
 
DXGI_SAMPLE_DESC sampleDesc
 
int currentFrameSlot = 0
 
int frameCount = 0
 
QD3D11RenderBufferds = nullptr
 
UINT swapInterval = 1
 
IDCompositionTarget * dcompTarget = nullptr
 
IDCompositionVisual * dcompVisual = nullptr
 
QD3D11Timestamps timestamps
 

Static Public Attributes

static const int BUFFER_COUNT = QD3D11_SWAPCHAIN_BUFFER_COUNT
 

Additional Inherited Members

- Public Types inherited from QRhiSwapChain
enum  Flag {
  SurfaceHasPreMulAlpha = 1 << 0 , SurfaceHasNonPreMulAlpha = 1 << 1 , sRGB = 1 << 2 , UsedAsTransferSource = 1 << 3 ,
  NoVSync = 1 << 4 , MinimalBufferCount = 1 << 5
}
 Flag values to describe swapchain properties. More...
 
enum  Format { SDR , HDRExtendedSrgbLinear , HDR10 }
 Describes the swapchain format. More...
 
enum  StereoTargetBuffer { LeftBuffer , RightBuffer }
 Selects the backbuffer to use with a stereoscopic swapchain. More...
 
- Public Types inherited from QRhiResource
enum  Type {
  Buffer , Texture , Sampler , RenderBuffer ,
  RenderPassDescriptor , SwapChainRenderTarget , TextureRenderTarget , ShaderResourceBindings ,
  GraphicsPipeline , SwapChain , ComputePipeline , CommandBuffer
}
 Specifies type of the resource. More...
 
- Protected Member Functions inherited from QRhiSwapChain
 QRhiSwapChain (QRhiImplementation *rhi)
 
- Protected Member Functions inherited from QRhiResource
 QRhiResource (QRhiImplementation *rhi)
 
- Protected Attributes inherited from QRhiSwapChain
QWindowm_window = nullptr
 
Flags m_flags
 
Format m_format = SDR
 
QRhiRenderBufferm_depthStencil = nullptr
 
int m_sampleCount = 1
 
QRhiRenderPassDescriptorm_renderPassDesc = nullptr
 
QSize m_currentPixelSize
 
QRhiSwapChainProxyData m_proxyData
 
- Protected Attributes inherited from QRhiResource
QRhiImplementationm_rhi = nullptr
 
quint64 m_id
 
QByteArray m_objectName
 

Detailed Description

Definition at line 574 of file qrhid3d11_p.h.

Constructor & Destructor Documentation

◆ QD3D11SwapChain()

QD3D11SwapChain::QD3D11SwapChain ( QRhiImplementation rhi)

Definition at line 4783 of file qrhid3d11.cpp.

References backBufferRtv, backBufferTex, BUFFER_COUNT, i, msaaRtv, and msaaTex.

◆ ~QD3D11SwapChain()

QD3D11SwapChain::~QD3D11SwapChain ( )

Definition at line 4796 of file qrhid3d11.cpp.

References destroy().

+ Here is the call graph for this function:

Member Function Documentation

◆ createOrResize()

bool QD3D11SwapChain::createOrResize ( )
overridevirtual

Creates the swapchain if not already done and resizes the swapchain buffers to match the current size of the targeted surface.

Call this whenever the size of the target surface is different than before.

Note
call destroy() only when the swapchain needs to be released completely, typically upon QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed. To perform resizing, just call createOrResize().
Returns
true when successful, false when a graphics operation failed. Regardless of the return value, calling destroy() is always safe.

Implements QRhiSwapChain.

Definition at line 4997 of file qrhid3d11.cpp.

References QSurfaceFormat::alphaBufferSize(), backBufferRtv, backBufferTex, BUFFER_COUNT, QD3D11RenderTargetData::colorAttCount, colorFormat, QRhiRenderBuffer::create(), currentFrameSlot, QD3D11SwapChainRenderTarget::d, dcompTarget, dcompVisual, DEFAULT_FORMAT, DEFAULT_SRGB_FORMAT, desc, destroy(), QD3D11RenderTargetData::dpr, ds, QD3D11RenderTargetData::dsAttCount, QRhi::EnableTimestamps, QRhiRenderBuffer::flags(), frameCount, QRhiSwapChain::HDR10, QRhiSwapChain::HDRExtendedSrgbLinear, QSize::height(), i, QSize::isEmpty(), QRhiSwapChain::m_currentPixelSize, QRhiSwapChain::m_depthStencil, QRhiSwapChain::m_flags, QRhiSwapChain::m_format, QRhiSwapChain::m_renderPassDesc, QRhiSwapChain::m_sampleCount, QRhiSwapChain::m_window, msaaRtv, msaaTex, newColorBuffer(), QRhiSwapChain::NoVSync, outputDesc1ForWindow(), QRhiRenderBuffer::pixelSize(), QD3D11RenderTargetData::pixelSize, pixelSize, QD3D11Timestamps::prepare(), qPrintable, QRHI_RES, QRHI_RES_RHI, qWarning, releaseBuffers(), QD3D11RenderTargetData::rp, rt, QRhiRenderBuffer::sampleCount(), QD3D11RenderTargetData::sampleCount, sampleDesc, QRhiSwapChain::SDR, QRhiRenderBuffer::setPixelSize(), QRhiRenderTarget::setRenderPassDescriptor(), QRhiSwapChain::sRGB, srgbAdjustedColorFormat, QRhiSwapChain::SurfaceHasNonPreMulAlpha, QRhiSwapChain::SurfaceHasPreMulAlpha, surfacePixelSize(), swapChain, swapChainFlags, swapInterval, timestamps, QRhiRenderBuffer::UsedWithSwapChainOnly, QSize::width(), and window.

+ Here is the call graph for this function:

◆ currentFrameCommandBuffer()

QRhiCommandBuffer * QD3D11SwapChain::currentFrameCommandBuffer ( )
overridevirtual
Returns
a command buffer on which rendering commands and resource updates can be recorded within a \l{QRhi::beginFrame()}{beginFrame} - \l{QRhi::endFrame()}{endFrame} block, assuming beginFrame() was called with this swapchain.
Note
The returned object is valid also after endFrame(), up until the next beginFrame(), but the returned command buffer should not be used to record any commands then. Rather, it can be used to query data collected during the frame (or previous frames), for example by calling \l{QRhiCommandBuffer::lastCompletedGpuTime()}{lastCompletedGpuTime()}.
The value must not be cached and reused between frames. The caller should not hold on to the returned object once \l{QRhi::beginFrame()}{beginFrame()} is called again. Instead, the command buffer object should be queried again by calling this function.

Implements QRhiSwapChain.

Definition at line 4850 of file qrhid3d11.cpp.

References cb.

◆ currentFrameRenderTarget()

QRhiRenderTarget * QD3D11SwapChain::currentFrameRenderTarget ( )
overridevirtual
Returns
a render target that can used with beginPass() in order to render the swapchain's current backbuffer. Only valid within a QRhi::beginFrame() - QRhi::endFrame() block where beginFrame() was called with this swapchain.
Note
the value must not be cached and reused between frames

Implements QRhiSwapChain.

Definition at line 4855 of file qrhid3d11.cpp.

References rt.

◆ destroy()

void QD3D11SwapChain::destroy ( )
overridevirtual

Releases (or requests deferred releasing of) the underlying native graphics resources.

Safe to call multiple times, subsequent invocations will be a no-op then.

Once destroy() is called, the QRhiResource instance can be reused, by calling create() again. That will then result in creating new native graphics resources underneath.

Note
Resources referenced by commands for the current frame should not be released until the frame is submitted by QRhi::endFrame().

The QRhiResource destructor also performs the same task, so calling this function is not necessary before deleting a QRhiResource.

See also
deleteLater()

Implements QRhiResource.

Definition at line 4823 of file qrhid3d11.cpp.

References dcompTarget, dcompVisual, QD3D11Timestamps::destroy(), QRHI_RES_RHI, releaseBuffers(), swapChain, and timestamps.

Referenced by ~QD3D11SwapChain(), and createOrResize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ hdrInfo()

QRhiSwapChainHdrInfo QD3D11SwapChain::hdrInfo ( )
overridevirtual

\variable QRhiSwapChainHdrInfo::isHardCodedDefaults

Set to true when the data in the QRhiSwapChainHdrInfo consists entirely of the hard-coded default values, for example because there is no way to query the relevant information with a given graphics API or platform. (or because querying it can be achieved only by means, e.g. platform APIs in some other area, that are out of scope for the QRhi layer of the Qt graphics stack to handle)

See also
QRhiSwapChain::hdrInfo()

\variable QRhiSwapChainHdrInfo::limitsType

With Metal on macOS/iOS, there is no luminance values exposed in the platform APIs. Instead, the maximum color component value, that would be 1.0 in a non-HDR setup, is provided. This value indicates what kind of information is available in \l limits.

See also
QRhiSwapChain::hdrInfo()

\variable QRhiSwapChainHdrInfo::limits

Contains the actual values queried from the graphics API or the platform. The type of data is indicated by \l limitsType. This is therefore a union. There are currently two options:

Luminance values in nits:

struct {
float minLuminance;
float maxLuminance;
} luminanceInNits;

Whereas for macOS/iOS, the current maximum and potential maximum color component values are provided:

struct {
float maxColorComponentValue;
float maxPotentialColorComponentValue;
} colorComponentValue;
See also
QRhiSwapChain::hdrInfo()
Returns
the HDR information for the associated display.

The returned struct is always the default one if createOrResize() has not been successfully called yet.

Note
What happens when moving a window with an initialized swapchain between displays (HDR to HDR with different characteristics, HDR to SDR, etc.) is not currently well-defined and depends heavily on the windowing system and compositor, with potentially varying behavior between platforms. Currently QRhi only guarantees that hdrInfo() returns valid data, if available, for the display to which the swapchain's associated window belonged at the time of createOrResize().
See also
QRhiSwapChainHdrInfo

Reimplemented from QRhiSwapChain.

Definition at line 4924 of file qrhid3d11.cpp.

References QRhiSwapChain::hdrInfo(), info, QRhiSwapChainHdrInfo::LuminanceInNits, QRhiSwapChain::m_window, outputDesc1ForWindow(), and QRHI_RES_RHI.

+ Here is the call graph for this function:

◆ isFormatSupported()

bool QD3D11SwapChain::isFormatSupported ( Format  f)
overridevirtual
Returns
true if the given swapchain format f is supported. SDR is always supported.
Note
Can be called independently of createOrResize(), but window() must already be set. Calling without the window set may lead to unexpected results depending on the backend and platform (most likely false for any HDR format), because HDR format support is usually tied to the output (screen) to which the swapchain's associated window belongs at any given time. If the result is true for a HDR format, then creating the swapchain with that format is expected to succeed as long as the window is not moved to another screen in the meantime.

The main use of this function is to call it before the first createOrResize() after the window is already set. This allow the QRhi backends to perform platform or windowing system specific queries to determine if the window (and the screen it is on) is capable of true HDR output with the specified format.

When the format is reported as supported, call setFormat() to set the requested format and call createOrResize(). Be aware of the consequences however: successfully requesting a HDR format will involve having to deal with a different color space, possibly doing white level correction for non-HDR-aware content, adjusting tonemapping methods, adjusting offscreen render target settings, etc.

See also
setFormat()

Implements QRhiSwapChain.

Definition at line 4904 of file qrhid3d11.cpp.

References QRhiSwapChain::HDR10, QRhiSwapChain::HDRExtendedSrgbLinear, QRhiSwapChain::m_window, outputDesc1ForWindow(), QRHI_RES_RHI, qWarning, and QRhiSwapChain::SDR.

+ Here is the call graph for this function:

◆ newColorBuffer()

bool QD3D11SwapChain::newColorBuffer ( const QSize size,
DXGI_FORMAT  format,
DXGI_SAMPLE_DESC  sampleDesc,
ID3D11Texture2D **  tex,
ID3D11RenderTargetView **  rtv 
) const

Definition at line 4948 of file qrhid3d11.cpp.

References desc, QRhiSwapChain::format(), qPrintable, QRHI_RES_RHI, qWarning, and sampleDesc.

Referenced by createOrResize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ newCompatibleRenderPassDescriptor()

QRhiRenderPassDescriptor * QD3D11SwapChain::newCompatibleRenderPassDescriptor ( )
overridevirtual
Returns
a new QRhiRenderPassDescriptor that is compatible with this swapchain.

The returned value is used in two ways: it can be passed to setRenderPassDescriptor() and QRhiGraphicsPipeline::setRenderPassDescriptor(). A render pass descriptor describes the attachments (color, depth/stencil) and the load/store behavior that can be affected by flags(). A QRhiGraphicsPipeline can only be used in combination with a swapchain that has a \l{QRhiRenderPassDescriptor::isCompatible()}{compatible} QRhiRenderPassDescriptor set.

See also
createOrResize()

Implements QRhiSwapChain.

Definition at line 4940 of file qrhid3d11.cpp.

References QRhiResource::m_rhi, and QRHI_RES_RHI.

◆ releaseBuffers()

void QD3D11SwapChain::releaseBuffers ( )

Definition at line 4801 of file qrhid3d11.cpp.

References backBufferRtv, backBufferTex, BUFFER_COUNT, i, msaaRtv, and msaaTex.

Referenced by createOrResize(), and destroy().

+ Here is the caller graph for this function:

◆ surfacePixelSize()

QSize QD3D11SwapChain::surfacePixelSize ( )
overridevirtual
Returns
The size of the window's associated surface or layer.
Warning
Do not assume this is the same as {QWindow::size() * QWindow::devicePixelRatio()}. With some graphics APIs and windowing system interfaces (for example, Vulkan) there is a theoretical possibility for a surface to assume a size different from the associated window. To support these cases, {rendering logic must always base size-derived calculations (such as, viewports) on the size reported from QRhiSwapChain, and never on the size queried from QWindow}.
Note
{Can also be called before createOrResize(), if at least window() is already set. This in combination with currentPixelSize() allows to detect when a swapchain needs to be resized.} However, watch out for the fact that the size of the underlying native object (surface, layer, or similar) is "live", so whenever this function is called, it returns the latest value reported by the underlying implementation, without any atomicity guarantee. Therefore, using this function to determine pixel sizes for graphics resources that are used in a frame is strongly discouraged. Rely on currentPixelSize() instead which returns a size that is atomic and will not change between createOrResize() invocations.
For depth-stencil buffers used in combination with the swapchain's color buffers, it is strongly recommended to rely on the automatic sizing and rebuilding behavior provided by the QRhiRenderBuffer:UsedWithSwapChainOnly flag. Avoid querying the surface size via this function just to get a size that can be passed to QRhiRenderBuffer::setPixelSize() as that would suffer from the lack of atomicity as described above.
See also
currentPixelSize()

Implements QRhiSwapChain.

Definition at line 4860 of file qrhid3d11.cpp.

References QRhiSwapChain::m_window, Q_ASSERT, and QWindow::size().

Referenced by createOrResize().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ backBufferRtv

ID3D11RenderTargetView* QD3D11SwapChain::backBufferRtv

◆ backBufferTex

ID3D11Texture2D* QD3D11SwapChain::backBufferTex

◆ BUFFER_COUNT

const int QD3D11SwapChain::BUFFER_COUNT = QD3D11_SWAPCHAIN_BUFFER_COUNT
static

◆ cb

QD3D11CommandBuffer QD3D11SwapChain::cb

◆ colorFormat

DXGI_FORMAT QD3D11SwapChain::colorFormat

◆ currentFrameSlot

int QD3D11SwapChain::currentFrameSlot = 0

◆ dcompTarget

IDCompositionTarget* QD3D11SwapChain::dcompTarget = nullptr

Definition at line 612 of file qrhid3d11_p.h.

Referenced by createOrResize(), destroy(), and QRhiD3D11::endFrame().

◆ dcompVisual

IDCompositionVisual* QD3D11SwapChain::dcompVisual = nullptr

Definition at line 613 of file qrhid3d11_p.h.

Referenced by createOrResize(), destroy(), and QRhiD3D11::endFrame().

◆ ds

QD3D11RenderBuffer* QD3D11SwapChain::ds = nullptr

Definition at line 610 of file qrhid3d11_p.h.

Referenced by QRhiD3D11::beginFrame(), and createOrResize().

◆ frameCount

int QD3D11SwapChain::frameCount = 0

Definition at line 609 of file qrhid3d11_p.h.

Referenced by createOrResize(), and QRhiD3D11::endFrame().

◆ msaaRtv

ID3D11RenderTargetView* QD3D11SwapChain::msaaRtv[BUFFER_COUNT]

◆ msaaTex

ID3D11Texture2D* QD3D11SwapChain::msaaTex[BUFFER_COUNT]

◆ pixelSize

QSize QD3D11SwapChain::pixelSize

Definition at line 595 of file qrhid3d11_p.h.

Referenced by createOrResize(), and QRhiD3D11::enqueueResourceUpdates().

◆ rt

◆ sampleDesc

DXGI_SAMPLE_DESC QD3D11SwapChain::sampleDesc

◆ srgbAdjustedColorFormat

DXGI_FORMAT QD3D11SwapChain::srgbAdjustedColorFormat

Definition at line 599 of file qrhid3d11_p.h.

Referenced by createOrResize().

◆ swapChain

IDXGISwapChain* QD3D11SwapChain::swapChain = nullptr

Definition at line 600 of file qrhid3d11_p.h.

Referenced by createOrResize(), destroy(), and QRhiD3D11::endFrame().

◆ swapChainFlags

UINT QD3D11SwapChain::swapChainFlags = 0

Definition at line 601 of file qrhid3d11_p.h.

Referenced by createOrResize(), and QRhiD3D11::endFrame().

◆ swapInterval

UINT QD3D11SwapChain::swapInterval = 1

Definition at line 611 of file qrhid3d11_p.h.

Referenced by createOrResize(), and QRhiD3D11::endFrame().

◆ timestamps

◆ window

QWindow* QD3D11SwapChain::window = nullptr

Definition at line 594 of file qrhid3d11_p.h.

Referenced by createOrResize().


The documentation for this struct was generated from the following files: