diff options
Diffstat (limited to 'helpers/dxgisize.hpp')
-rw-r--r-- | helpers/dxgisize.hpp | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/helpers/dxgisize.hpp b/helpers/dxgisize.hpp index cbe526fb..5ebbb43c 100644 --- a/helpers/dxgisize.hpp +++ b/helpers/dxgisize.hpp @@ -30,8 +30,7 @@ * Auxiliary functions to compute the size of array/blob arguments. */ -#ifndef _DXGISIZE_HPP_ -#define _DXGISIZE_HPP_ +#pragma once /* We purposedly don't include any D3D header, so that this header can be used @@ -60,8 +59,9 @@ struct _MAP_DESC static size_t -_calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT Depth = 1, UINT DepthPitch = 0) { - if (Width == 0 || Height == 0 || Depth == 0) { +_calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch) +{ + if (Width == 0 || Height == 0) { return 0; } @@ -132,6 +132,7 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8X8_TYPELESS: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: + case DXGI_FORMAT_AYUV: BlockSize = 32; break; case DXGI_FORMAT_R8G8_TYPELESS: @@ -148,6 +149,8 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D case DXGI_FORMAT_R16_SINT: case DXGI_FORMAT_B5G6R5_UNORM: case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_B4G4R4A4_UNORM: + case DXGI_FORMAT_A8P8: BlockSize = 16; break; case DXGI_FORMAT_R8_TYPELESS: @@ -156,6 +159,7 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D case DXGI_FORMAT_R8_SNORM: case DXGI_FORMAT_R8_SINT: case DXGI_FORMAT_A8_UNORM: + case DXGI_FORMAT_P8: BlockSize = 8; break; case DXGI_FORMAT_R1_UNORM: @@ -163,6 +167,7 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D break; case DXGI_FORMAT_R8G8_B8G8_UNORM: case DXGI_FORMAT_G8R8_G8B8_UNORM: + case DXGI_FORMAT_YUY2: BlockSize = 32; BlockWidth = 2; break; @@ -195,8 +200,25 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D BlockWidth = 4; BlockHeight = 4; break; + + case DXGI_FORMAT_NV12: + return (Height + (Height + 1)/2) * RowPitch; + + case DXGI_FORMAT_Y410: + case DXGI_FORMAT_Y416: + case DXGI_FORMAT_P010: + case DXGI_FORMAT_P016: + case DXGI_FORMAT_420_OPAQUE: + case DXGI_FORMAT_Y210: + case DXGI_FORMAT_Y216: + case DXGI_FORMAT_NV11: + case DXGI_FORMAT_AI44: + case DXGI_FORMAT_IA44: + os::log("apitrace: warning: %s: unsupported DXGI format %u\n", __FUNCTION__, Format); + return 0; + default: - os::log("apitrace: warning: %s: unknown format 0x%04X\n", __FUNCTION__, Format); + os::log("apitrace: warning: %s: unknown DXGI format %u\n", __FUNCTION__, Format); return 0; } @@ -209,13 +231,25 @@ _calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT D size += (Height - 1) * RowPitch; } - if (Depth > 1) { + return size; +} + +static size_t +_calcDataSize(DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT Depth, UINT DepthPitch) +{ + if (Depth == 0) { + return 0; + } + + size_t size = _calcDataSize(Format, Width, Height, RowPitch); + if (size && Depth > 1) { size += (Depth - 1) * DepthPitch; } return size; } + static size_t _calcMipDataSize(UINT MipLevel, DXGI_FORMAT Format, UINT Width, UINT Height, UINT RowPitch, UINT Depth = 1, UINT DepthPitch = 0) { if (Width == 0 || Height == 0 || Depth == 0) { @@ -264,4 +298,3 @@ _getMapDesc(IDXGISurface *pResource, DXGI_MAPPED_RECT * pLockedRect, UINT MapFla } -#endif /* _DXGISIZE_HPP_ */ |