DirectXTex updated with DDS_FLAGS_ALLOW_LARGE_FILES (#188)

This commit is contained in:
Chuck Walbourn 2020-07-09 14:13:38 -07:00 committed by GitHub
parent 81ab7997ec
commit d980fb6576
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 5 deletions

View File

@ -172,6 +172,8 @@ namespace DirectX
DDS_FLAGS_FORCE_DX9_LEGACY = 0x40000, DDS_FLAGS_FORCE_DX9_LEGACY = 0x40000,
// Force use of legacy header for DDS writer (will fail if unable to write as such) // Force use of legacy header for DDS writer (will fail if unable to write as such)
DDS_FLAGS_ALLOW_LARGE_FILES = 0x1000000,
// Enables the loader to read large dimension .dds files (i.e. greater than known hardware requirements)
}; };
enum WIC_FLAGS : unsigned long enum WIC_FLAGS : unsigned long

View File

@ -525,6 +525,25 @@ namespace
metadata.SetAlphaMode(TEX_ALPHA_MODE_PREMULTIPLIED); metadata.SetAlphaMode(TEX_ALPHA_MODE_PREMULTIPLIED);
} }
// Check for .dds files that exceed known hardware support
if (!(flags & DDS_FLAGS_ALLOW_LARGE_FILES))
{
// 16k is the maximum required resource size supported by Direct3D
if (metadata.width > 16384u /* D3D12_REQ_TEXTURE1D_U_DIMENSION, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION */
|| metadata.height > 16384u /* D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION */
|| metadata.mipLevels > 15u /* D3D12_REQ_MIP_LEVELS */)
{
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
}
// 2048 is the maximum required depth/array size supported by Direct3D
if (metadata.arraySize > 2048u /* D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION, D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION */
|| metadata.depth > 2048u /* D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION */)
{
return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
}
}
return S_OK; return S_OK;
} }
} }

View File

@ -1068,7 +1068,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
case CMD_V_STRIP: case CMD_V_STRIP:
if (_wcsicmp(ext, L".dds") == 0) if (_wcsicmp(ext, L".dds") == 0)
{ {
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_NONE, &info, *image); hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
if (FAILED(hr)) if (FAILED(hr))
{ {
wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr)); wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr));
@ -1095,7 +1095,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
case CMD_ARRAY_STRIP: case CMD_ARRAY_STRIP:
if (_wcsicmp(ext, L".dds") == 0) if (_wcsicmp(ext, L".dds") == 0)
{ {
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_NONE, &info, *image); hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
if (FAILED(hr)) if (FAILED(hr))
{ {
wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr)); wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr));
@ -1118,7 +1118,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
default: default:
if (_wcsicmp(ext, L".dds") == 0) if (_wcsicmp(ext, L".dds") == 0)
{ {
hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_NONE, &info, *image); hr = LoadFromDDSFile(pConv->szSrc, DDS_FLAGS_ALLOW_LARGE_FILES, &info, *image);
if (FAILED(hr)) if (FAILED(hr))
{ {
wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr)); wprintf(L" FAILED (%x)\n", static_cast<unsigned int>(hr));

View File

@ -1672,7 +1672,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
if (_wcsicmp(ext, L".dds") == 0) if (_wcsicmp(ext, L".dds") == 0)
{ {
DDS_FLAGS ddsFlags = DDS_FLAGS_NONE; DDS_FLAGS ddsFlags = DDS_FLAGS_ALLOW_LARGE_FILES;
if (dwOptions & (DWORD64(1) << OPT_DDS_DWORD_ALIGN)) if (dwOptions & (DWORD64(1) << OPT_DDS_DWORD_ALIGN))
ddsFlags |= DDS_FLAGS_LEGACY_DWORD; ddsFlags |= DDS_FLAGS_LEGACY_DWORD;
if (dwOptions & (DWORD64(1) << OPT_EXPAND_LUMINANCE)) if (dwOptions & (DWORD64(1) << OPT_EXPAND_LUMINANCE))

View File

@ -592,7 +592,7 @@ namespace
if (_wcsicmp(ext, L".dds") == 0) if (_wcsicmp(ext, L".dds") == 0)
{ {
DDS_FLAGS ddsFlags = DDS_FLAGS_NONE; DDS_FLAGS ddsFlags = DDS_FLAGS_ALLOW_LARGE_FILES;
if (dwOptions & (1 << OPT_DDS_DWORD_ALIGN)) if (dwOptions & (1 << OPT_DDS_DWORD_ALIGN))
ddsFlags |= DDS_FLAGS_LEGACY_DWORD; ddsFlags |= DDS_FLAGS_LEGACY_DWORD;
if (dwOptions & (1 << OPT_EXPAND_LUMINANCE)) if (dwOptions & (1 << OPT_EXPAND_LUMINANCE))