mirror of
https://github.com/microsoft/DirectXTex.git
synced 2025-07-09 03:30:13 +02:00
Add ComputeTileShape utility (#595)
This commit is contained in:
parent
75105c7e88
commit
666e28c955
@ -513,6 +513,53 @@ namespace DirectX
|
|||||||
size_t m_size;
|
size_t m_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
// Tiling utilities
|
||||||
|
|
||||||
|
struct DIRECTX_TEX_API TileShape
|
||||||
|
{
|
||||||
|
size_t width;
|
||||||
|
size_t height;
|
||||||
|
size_t depth;
|
||||||
|
|
||||||
|
TileShape() = default;
|
||||||
|
|
||||||
|
#if defined(__d3d11_2_h__) || defined(__d3d11_x_h__)
|
||||||
|
TileShape(const D3D11_TILE_SHAPE& tile) :
|
||||||
|
width(tile.WidthInTexels),
|
||||||
|
height(tile.HeightInTexels),
|
||||||
|
depth(tile.DepthInTexels)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetTileShape11(D3D11_TILE_SHAPE& tile) const
|
||||||
|
{
|
||||||
|
tile.WidthInTexels = static_cast<UINT>(width);
|
||||||
|
tile.HeightInTexels = static_cast<UINT>(height);
|
||||||
|
tile.DepthInTexels = static_cast<UINT>(depth);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__)
|
||||||
|
TileShape(const D3D12_TILE_SHAPE& tile) :
|
||||||
|
width(tile.WidthInTexels),
|
||||||
|
height(tile.HeightInTexels),
|
||||||
|
depth(tile.DepthInTexels)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetTileShape12(D3D12_TILE_SHAPE& tile) const
|
||||||
|
{
|
||||||
|
tile.WidthInTexels = static_cast<UINT>(width);
|
||||||
|
tile.HeightInTexels = static_cast<UINT>(height);
|
||||||
|
tile.DepthInTexels = static_cast<UINT>(depth);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
DIRECTX_TEX_API HRESULT __cdecl ComputeTileShape(_In_ DXGI_FORMAT fmt, _In_ TEX_DIMENSION dimension,
|
||||||
|
_Out_ TileShape& tiling) noexcept;
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
// Image I/O
|
// Image I/O
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <d3d11_4.h>
|
#include <d3d11_4.h>
|
||||||
#else
|
#else
|
||||||
#include <d3d11_1.h>
|
#include <d3d11_2.h>
|
||||||
#endif
|
#endif
|
||||||
#else // !WIN32
|
#else // !WIN32
|
||||||
#include <wsl/winadapter.h>
|
#include <wsl/winadapter.h>
|
||||||
|
@ -1246,6 +1246,163 @@ size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
// Compute standard tile shape for 64KB tiles
|
||||||
|
//-------------------------------------------------------------------------------------
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
constexpr size_t TILED_RESOURCE_TILE_SIZE_IN_BYTES = 65536;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Use_decl_annotations_
|
||||||
|
HRESULT DirectX::ComputeTileShape(
|
||||||
|
DXGI_FORMAT fmt,
|
||||||
|
TEX_DIMENSION dimension,
|
||||||
|
TileShape& tiling) noexcept
|
||||||
|
{
|
||||||
|
tiling = {};
|
||||||
|
|
||||||
|
if (IsVideo(fmt) || IsPacked(fmt))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
const size_t bpp = BitsPerPixel(fmt);
|
||||||
|
if (!bpp || bpp == 1 || bpp == 24 || bpp == 96)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
const bool iscompressed = IsCompressed(fmt);
|
||||||
|
|
||||||
|
switch(dimension)
|
||||||
|
{
|
||||||
|
case TEX_DIMENSION_TEXTURE1D:
|
||||||
|
if (iscompressed)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
tiling.width = (bpp) ? ((TILED_RESOURCE_TILE_SIZE_IN_BYTES * 8) / bpp) : TILED_RESOURCE_TILE_SIZE_IN_BYTES;
|
||||||
|
tiling.height = tiling.depth = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TEX_DIMENSION_TEXTURE2D:
|
||||||
|
tiling.depth = 1;
|
||||||
|
if(iscompressed)
|
||||||
|
{
|
||||||
|
size_t bpb = BytesPerBlock(fmt);
|
||||||
|
switch(bpb)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
tiling.width = 128 * 4;
|
||||||
|
tiling.height = 64 * 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
tiling.width = tiling.height = 64 * 4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(((tiling.width / 4) * (tiling.height / 4) * bpb) == TILED_RESOURCE_TILE_SIZE_IN_BYTES);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bpp <= 8)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = 256;
|
||||||
|
}
|
||||||
|
else if (bpp <= 16)
|
||||||
|
{
|
||||||
|
tiling.width = 256;
|
||||||
|
tiling.height = 128;
|
||||||
|
}
|
||||||
|
else if (bpp <= 32)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = 128;
|
||||||
|
}
|
||||||
|
else if (bpp <= 64)
|
||||||
|
{
|
||||||
|
tiling.width = 128;
|
||||||
|
tiling.height = 64;
|
||||||
|
}
|
||||||
|
else if (bpp <= 128)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = 64;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tiling = {};
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(((tiling.width * tiling.height * bpp) / 8) == TILED_RESOURCE_TILE_SIZE_IN_BYTES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TEX_DIMENSION_TEXTURE3D:
|
||||||
|
if(iscompressed)
|
||||||
|
{
|
||||||
|
size_t bpb = BytesPerBlock(fmt);
|
||||||
|
switch(bpb)
|
||||||
|
{
|
||||||
|
case 8:
|
||||||
|
tiling.width = 32 * 4;
|
||||||
|
tiling.height = 16 * 4;
|
||||||
|
tiling.depth = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
tiling.width = tiling.height = 16 * 4;
|
||||||
|
tiling.depth = 16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(((tiling.width / 4) * (tiling.height / 4) * tiling.depth * bpb) == TILED_RESOURCE_TILE_SIZE_IN_BYTES);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bpp <= 8)
|
||||||
|
{
|
||||||
|
tiling.width = 64;
|
||||||
|
tiling.height = tiling.depth = 32;
|
||||||
|
}
|
||||||
|
else if (bpp <= 16)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = tiling.depth = 32;
|
||||||
|
}
|
||||||
|
else if (bpp <= 32)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = 32;
|
||||||
|
tiling.depth = 16;
|
||||||
|
}
|
||||||
|
else if (bpp <= 64)
|
||||||
|
{
|
||||||
|
tiling.width = 32;
|
||||||
|
tiling.height = tiling.depth = 16;
|
||||||
|
}
|
||||||
|
else if (bpp <= 128)
|
||||||
|
{
|
||||||
|
tiling.width = tiling.height = tiling.depth = 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tiling = {};
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(((tiling.width * tiling.height * tiling.depth * bpp) / 8) == TILED_RESOURCE_TILE_SIZE_IN_BYTES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------
|
||||||
// Converts to an SRGB equivalent type if available
|
// Converts to an SRGB equivalent type if available
|
||||||
//-------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user