diff --git a/Auxiliary/DirectXTexXboxDetile.cpp b/Auxiliary/DirectXTexXboxDetile.cpp index afae310b..29807839 100644 --- a/Auxiliary/DirectXTexXboxDetile.cpp +++ b/Auxiliary/DirectXTexXboxDetile.cpp @@ -32,7 +32,9 @@ namespace const uint8_t* sptr = xbox.GetPointer(); const uint8_t* endPtr = sptr + layout.SizeBytes; - for (uint32_t item = 0; item < nimages; ++item) + assert((nimages > 0) && (nimages <= UINT32_MAX)); + + for (size_t item = 0; item < nimages; ++item) { const Image* img = result[item]; if (!img || !img->pixels) @@ -49,9 +51,9 @@ namespace { #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) const UINT64 element = (packed) ? (x >> 1) : x; - const size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, item, 0, nullptr); + const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast(level), element, 0, static_cast(item), 0, nullptr); #else - const size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); + const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast(level), x, 0, static_cast(item), 0); #endif if (offset == size_t(-1)) return E_FAIL; @@ -83,7 +85,7 @@ namespace _In_reads_(nimages) const Image** result, size_t nimages) { - if (!nimages) + if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; if (!xbox.GetPointer() || !computer || !result || !result[0]) @@ -150,7 +152,7 @@ namespace return E_FAIL; // Perform detiling - for (uint32_t item = 0; item < nimages; ++item) + for (size_t item = 0; item < nimages; ++item) { const Image* img = result[item]; if (!img || !img->pixels) @@ -164,9 +166,9 @@ namespace for (size_t x = 0; x < img->width; ++x) { #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0, nullptr); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0, nullptr); #else - size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); #endif if (offset == size_t(-1)) return E_FAIL; @@ -199,7 +201,7 @@ namespace _In_reads_(nimages) const Image** result, size_t nimages) { - if (!nimages) + if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; if (!xbox.GetPointer() || !computer || !result || !result[0]) @@ -210,7 +212,7 @@ namespace uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); - for (uint32_t item = 0; item < nimages; ++item) + for (size_t item = 0; item < nimages; ++item) { const Image* img = result[item]; if (!img || !img->pixels) @@ -314,6 +316,11 @@ HRESULT Xbox::Detile( { case TEX_DIMENSION_TEXTURE1D: { + if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; + XG_TEXTURE1D_DESC desc = {}; desc.Width = static_cast(metadata.width); desc.MipLevels = static_cast(metadata.mipLevels); @@ -348,13 +355,13 @@ HRESULT Xbox::Detile( if (FAILED(hr)) return hr; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if (metadata.arraySize > 1) { std::vector images; images.reserve(metadata.arraySize); - for (uint32_t item = 0; item < metadata.arraySize; ++item) + for (size_t item = 0; item < metadata.arraySize; ++item) { const Image* img = image.GetImage(level, item, 0); if (!img) @@ -366,7 +373,7 @@ HRESULT Xbox::Detile( images.push_back(img); } - hr = Detile1D(xbox, level, computer.Get(), layout, &images[0], images.size()); + hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &images[0], images.size()); } else { @@ -377,7 +384,7 @@ HRESULT Xbox::Detile( return E_FAIL; } - hr = Detile1D(xbox, level, computer.Get(), layout, &img, 1); + hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &img, 1); } if (FAILED(hr)) @@ -391,6 +398,12 @@ HRESULT Xbox::Detile( case TEX_DIMENSION_TEXTURE2D: { + if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; + XG_TEXTURE2D_DESC desc = {}; desc.Width = static_cast(metadata.width); desc.Height = static_cast(metadata.height); @@ -427,13 +440,13 @@ HRESULT Xbox::Detile( if (FAILED(hr)) return hr; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if (metadata.arraySize > 1) { std::vector images; images.reserve(metadata.arraySize); - for (uint32_t item = 0; item < metadata.arraySize; ++item) + for (size_t item = 0; item < metadata.arraySize; ++item) { const Image* img = image.GetImage(level, item, 0); if (!img) @@ -445,7 +458,7 @@ HRESULT Xbox::Detile( images.push_back(img); } - hr = Detile2D(xbox, level, computer.Get(), &images[0], images.size()); + hr = Detile2D(xbox, static_cast(level), computer.Get(), &images[0], images.size()); } else { @@ -456,7 +469,7 @@ HRESULT Xbox::Detile( return E_FAIL; } - hr = Detile2D(xbox, level, computer.Get(), &img, 1); + hr = Detile2D(xbox, static_cast(level), computer.Get(), &img, 1); } if (FAILED(hr)) @@ -470,6 +483,13 @@ HRESULT Xbox::Detile( case TEX_DIMENSION_TEXTURE3D: { + if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize != 1) + return E_INVALIDARG; + XG_TEXTURE3D_DESC desc = {}; desc.Width = static_cast(metadata.width); desc.Height = static_cast(metadata.height); @@ -504,10 +524,10 @@ HRESULT Xbox::Detile( if (FAILED(hr)) return hr; - uint32_t d = static_cast(metadata.depth); + auto d = static_cast(metadata.depth); size_t index = 0; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if ((index + d) > image.GetImageCount()) { @@ -516,7 +536,7 @@ HRESULT Xbox::Detile( } // Relies on the fact that slices are contiguous - hr = Detile3D(xbox, level, computer.Get(), image.GetImages()[index]); + hr = Detile3D(xbox, static_cast(level), computer.Get(), image.GetImages()[index]); if (FAILED(hr)) { image.Release(); diff --git a/Auxiliary/DirectXTexXboxTile.cpp b/Auxiliary/DirectXTexXboxTile.cpp index 93d25ab4..ecd8b5b9 100644 --- a/Auxiliary/DirectXTexXboxTile.cpp +++ b/Auxiliary/DirectXTexXboxTile.cpp @@ -34,7 +34,7 @@ namespace uint8_t* dptr = xbox.GetPointer(); const uint8_t* endPtr = dptr + layout.SizeBytes; - for (uint32_t item = 0; item < nimages; ++item) + for (size_t item = 0; item < nimages; ++item) { const Image* img = images[item]; @@ -52,9 +52,9 @@ namespace { #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) UINT64 element = (packed) ? (x >> 1) : x; - size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, item, 0, nullptr); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, static_cast(item), 0, nullptr); #else - size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); #endif if (offset == size_t(-1)) return E_FAIL; @@ -169,7 +169,7 @@ namespace const XG_RESOURCE_LAYOUT& layout, const XboxImage& xbox) { - if (!nimages) + if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; if (!images || !images[0] || !computer || !xbox.GetPointer()) @@ -230,7 +230,7 @@ namespace memset(tiled, 0, sizeof(XMVECTOR) * tiledPixels); // Perform tiling - for (uint32_t item = 0; item < nimages; ++item) + for (size_t item = 0; item < nimages; ++item) { const Image* img = images[item]; @@ -248,9 +248,9 @@ namespace for (size_t x = 0; x < img->width; ++x) { #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0, nullptr); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0, nullptr); #else - size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, item, 0); + size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); #endif if (offset == size_t(-1)) return E_FAIL; @@ -285,7 +285,7 @@ namespace _In_ XGTextureAddressComputer* computer, const XboxImage& xbox) { - if (!nimages) + if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; if (!images || !images[0] || !computer || !xbox.GetPointer()) @@ -294,7 +294,7 @@ namespace uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); - for (uint32_t item = 0; item < nimages; ++item) + for (size_t item = 0; item < nimages; ++item) { const Image* img = images[item]; @@ -444,15 +444,39 @@ HRESULT Xbox::Tile( XboxImage& xbox, XboxTileMode mode) { - if (!srcImages - || !nimages - || metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS) + if (!srcImages || !nimages || nimages > UINT32_MAX) return E_INVALIDARG; + switch (metadata.dimension) + { + case TEX_DIMENSION_TEXTURE1D: + if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; + break; + + case TEX_DIMENSION_TEXTURE2D: + if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; + break; + + case TEX_DIMENSION_TEXTURE3D: + if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize != 1) + return E_INVALIDARG; + break; + + default: + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } + xbox.Release(); if (metadata.format == DXGI_FORMAT_R1_UNORM @@ -533,13 +557,13 @@ HRESULT Xbox::Tile( if (FAILED(hr)) return hr; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if (metadata.arraySize > 1) { std::vector images; images.reserve(metadata.arraySize); - for (uint32_t item = 0; item < metadata.arraySize; ++item) + for (size_t item = 0; item < metadata.arraySize; ++item) { const size_t index = metadata.ComputeIndex(level, item, 0); if (index >= nimages) @@ -551,7 +575,7 @@ HRESULT Xbox::Tile( images.push_back(&srcImages[index]); } - hr = Tile1D(&images[0], images.size(), level, computer.Get(), layout, xbox); + hr = Tile1D(&images[0], images.size(), static_cast(level), computer.Get(), layout, xbox); } else { @@ -563,7 +587,7 @@ HRESULT Xbox::Tile( } const Image* images = &srcImages[index]; - hr = Tile1D(&images, 1, level, computer.Get(), layout, xbox); + hr = Tile1D(&images, 1, static_cast(level), computer.Get(), layout, xbox); } if (FAILED(hr)) @@ -617,13 +641,13 @@ HRESULT Xbox::Tile( if (FAILED(hr)) return hr; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if (metadata.arraySize > 1) { std::vector images; images.reserve(metadata.arraySize); - for (uint32_t item = 0; item < metadata.arraySize; ++item) + for (size_t item = 0; item < metadata.arraySize; ++item) { const size_t index = metadata.ComputeIndex(level, item, 0); if (index >= nimages) @@ -635,7 +659,7 @@ HRESULT Xbox::Tile( images.push_back(&srcImages[index]); } - hr = Tile2D(&images[0], images.size(), level, computer.Get(), xbox); + hr = Tile2D(&images[0], images.size(), static_cast(level), computer.Get(), xbox); } else { @@ -647,7 +671,7 @@ HRESULT Xbox::Tile( } const Image* images = &srcImages[index]; - hr = Tile2D(&images, 1, level, computer.Get(), xbox); + hr = Tile2D(&images, 1, static_cast(level), computer.Get(), xbox); } if (FAILED(hr)) @@ -699,10 +723,10 @@ HRESULT Xbox::Tile( if (FAILED(hr)) return hr; - uint32_t d = static_cast(metadata.depth); + auto d = static_cast(metadata.depth); size_t index = 0; - for (uint32_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) { if ((index + d) > nimages) { @@ -711,7 +735,7 @@ HRESULT Xbox::Tile( } // Relies on the fact that slices are contiguous - hr = Tile3D(srcImages[index], level, computer.Get(), xbox); + hr = Tile3D(srcImages[index], static_cast(level), computer.Get(), xbox); if (FAILED(hr)) { xbox.Release(); diff --git a/build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml b/build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml index 1a247088..fde88d36 100644 --- a/build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml +++ b/build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml @@ -25,6 +25,7 @@ pr: - build/*.in - build/DirectXTex-GitHub-CMake-Xbox-Dev17.yml - DirectXTex/Shaders/CompileShaders.cmd + - Auxiliary/*Xbox* resources: repositories: diff --git a/build/DirectXTex-GitHub-GDK-Dev17.yml b/build/DirectXTex-GitHub-GDK-Dev17.yml index 56d54fed..be7eb76b 100644 --- a/build/DirectXTex-GitHub-GDK-Dev17.yml +++ b/build/DirectXTex-GitHub-GDK-Dev17.yml @@ -26,6 +26,7 @@ pr: - build/*.cmake - build/SetupBWOI.* - DirectXTex/Shaders/CompileShaders.cmd + - Auxiliary/*Xbox* resources: repositories: diff --git a/build/DirectXTex-GitHub-WSL-11.yml b/build/DirectXTex-GitHub-WSL-11.yml index efe995cb..a20e5380 100644 --- a/build/DirectXTex-GitHub-WSL-11.yml +++ b/build/DirectXTex-GitHub-WSL-11.yml @@ -24,6 +24,9 @@ pr: - build/*.cmake - build/*.in - build/DirectXTex-GitHub-WSL-11.yml + - Auxiliary/*EXR* + - Auxiliary/*JPEG* + - Auxiliary/*PNG* resources: repositories: diff --git a/build/DirectXTex-GitHub-WSL-13.yml b/build/DirectXTex-GitHub-WSL-13.yml index b872b0ff..4e783b8e 100644 --- a/build/DirectXTex-GitHub-WSL-13.yml +++ b/build/DirectXTex-GitHub-WSL-13.yml @@ -24,6 +24,9 @@ pr: - build/*.cmake - build/*.in - build/DirectXTex-GitHub-WSL-13.yml + - Auxiliary/*EXR* + - Auxiliary/*JPEG* + - Auxiliary/*PNG* resources: repositories: