rhi: d3d: Bail out properly when texture format is not supported
Have QRhiTexture::create() fail by returning false, as expected, when trying to create a texture with an unsupported compressed texture format (ASTC, ETC). Right now there are warnings, but create() does not indicate failure, and then Quick 3D apps almost certainly end up in a crash when they try to use ASTC textures. Change-Id: I09b4bb01b1655788d87a263b1b47ea8856c975cb Reviewed-by: Andy Nichols <andy.nichols@qt.io> (cherry picked from commit 2bfa2d6b21e807dcf375a82e10c40616e7e475ce) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
00d3afe4ff
commit
565e3aaf8b
@ -3301,6 +3301,10 @@ bool QD3D11Texture::prepareCreate(QSize *adjustedSize)
|
|||||||
if (tex || tex3D || tex1D)
|
if (tex || tex3D || tex1D)
|
||||||
destroy();
|
destroy();
|
||||||
|
|
||||||
|
QRHI_RES_RHI(QRhiD3D11);
|
||||||
|
if (!rhiD->isTextureFormatSupported(m_format, m_flags))
|
||||||
|
return false;
|
||||||
|
|
||||||
const bool isDepth = isDepthTextureFormat(m_format);
|
const bool isDepth = isDepthTextureFormat(m_format);
|
||||||
const bool isCube = m_flags.testFlag(CubeMap);
|
const bool isCube = m_flags.testFlag(CubeMap);
|
||||||
const bool is3D = m_flags.testFlag(ThreeDimensional);
|
const bool is3D = m_flags.testFlag(ThreeDimensional);
|
||||||
@ -3311,7 +3315,6 @@ bool QD3D11Texture::prepareCreate(QSize *adjustedSize)
|
|||||||
const QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
|
const QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
|
||||||
: (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
|
: (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
|
||||||
|
|
||||||
QRHI_RES_RHI(QRhiD3D11);
|
|
||||||
dxgiFormat = toD3DTextureFormat(m_format, m_flags);
|
dxgiFormat = toD3DTextureFormat(m_format, m_flags);
|
||||||
mipLevelCount = uint(hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1);
|
mipLevelCount = uint(hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1);
|
||||||
sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount);
|
sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount);
|
||||||
|
@ -4184,6 +4184,10 @@ bool QD3D12Texture::prepareCreate(QSize *adjustedSize)
|
|||||||
if (!handle.isNull())
|
if (!handle.isNull())
|
||||||
destroy();
|
destroy();
|
||||||
|
|
||||||
|
QRHI_RES_RHI(QRhiD3D12);
|
||||||
|
if (!rhiD->isTextureFormatSupported(m_format, m_flags))
|
||||||
|
return false;
|
||||||
|
|
||||||
const bool isDepth = isDepthTextureFormat(m_format);
|
const bool isDepth = isDepthTextureFormat(m_format);
|
||||||
const bool isCube = m_flags.testFlag(CubeMap);
|
const bool isCube = m_flags.testFlag(CubeMap);
|
||||||
const bool is3D = m_flags.testFlag(ThreeDimensional);
|
const bool is3D = m_flags.testFlag(ThreeDimensional);
|
||||||
@ -4215,7 +4219,6 @@ bool QD3D12Texture::prepareCreate(QSize *adjustedSize)
|
|||||||
srvFormat = toD3DTextureFormat(m_readViewFormat.format, m_readViewFormat.srgb ? sRGB : Flags());
|
srvFormat = toD3DTextureFormat(m_readViewFormat.format, m_readViewFormat.srgb ? sRGB : Flags());
|
||||||
}
|
}
|
||||||
|
|
||||||
QRHI_RES_RHI(QRhiD3D12);
|
|
||||||
mipLevelCount = uint(hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1);
|
mipLevelCount = uint(hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1);
|
||||||
sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount, dxgiFormat);
|
sampleDesc = rhiD->effectiveSampleDesc(m_sampleCount, dxgiFormat);
|
||||||
if (sampleDesc.Count > 1) {
|
if (sampleDesc.Count > 1) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user