18 #if !defined(_XBOX_ONE) || !defined(_TITLE) || !MONOLITHIC
22 using Microsoft::WRL::ComPtr;
30 if ( !pContext || !pSource || !result.GetPixels() )
33 if ( metadata.IsVolumemap() )
36 assert( metadata.arraySize == 1 );
38 size_t height = metadata.height;
39 size_t depth = metadata.depth;
41 for(
size_t level = 0; level < metadata.mipLevels; ++level )
43 UINT dindex = D3D11CalcSubresource( static_cast<UINT>( level ), 0, static_cast<UINT>( metadata.mipLevels ) );
45 D3D11_MAPPED_SUBRESOURCE mapped;
46 HRESULT hr = pContext->Map( pSource, dindex, D3D11_MAP_READ, 0, &mapped );
50 auto pslice =
reinterpret_cast<const uint8_t*
>( mapped.pData );
53 pContext->Unmap( pSource, dindex );
60 pContext->Unmap( pSource, dindex );
64 for(
size_t slice = 0; slice < depth; ++slice )
66 const Image* img = result.GetImage( level, 0, slice );
69 pContext->Unmap( pSource, dindex );
75 pContext->Unmap( pSource, dindex );
81 for(
size_t h = 0; h < lines; ++h )
83 size_t msize = std::min<size_t>( img->
rowPitch, mapped.RowPitch );
84 memcpy_s( dptr, img->
rowPitch, sptr, msize );
85 sptr += mapped.RowPitch;
89 pslice += mapped.DepthPitch;
92 pContext->Unmap( pSource, dindex );
103 assert( metadata.depth == 1 );
105 for(
size_t item = 0; item < metadata.arraySize; ++item )
107 size_t height = metadata.height;
109 for(
size_t level = 0; level < metadata.mipLevels; ++level )
111 UINT dindex = D3D11CalcSubresource( static_cast<UINT>( level ), static_cast<UINT>( item ), static_cast<UINT>( metadata.mipLevels ) );
113 D3D11_MAPPED_SUBRESOURCE mapped;
114 HRESULT hr = pContext->Map( pSource, dindex, D3D11_MAP_READ, 0, &mapped );
118 const Image* img = result.GetImage( level, item, 0 );
121 pContext->Unmap( pSource, dindex );
127 pContext->Unmap( pSource, dindex );
134 pContext->Unmap( pSource, dindex );
138 auto sptr =
reinterpret_cast<const uint8_t*
>( mapped.pData );
140 for(
size_t h = 0; h < lines; ++h )
142 size_t msize = std::min<size_t>( img->
rowPitch, mapped.RowPitch );
143 memcpy_s( dptr, img->
rowPitch, sptr, msize );
144 sptr += mapped.RowPitch;
148 pContext->Unmap( pSource, dindex );
167 _Use_decl_annotations_
173 D3D_FEATURE_LEVEL fl = pDevice->GetFeatureLevel();
176 DXGI_FORMAT fmt = metadata.
format;
183 case DXGI_FORMAT_BC4_TYPELESS:
184 case DXGI_FORMAT_BC4_UNORM:
185 case DXGI_FORMAT_BC4_SNORM:
186 case DXGI_FORMAT_BC5_TYPELESS:
187 case DXGI_FORMAT_BC5_UNORM:
188 case DXGI_FORMAT_BC5_SNORM:
189 if ( fl < D3D_FEATURE_LEVEL_10_0 )
193 case DXGI_FORMAT_BC6H_TYPELESS:
194 case DXGI_FORMAT_BC6H_UF16:
195 case DXGI_FORMAT_BC6H_SF16:
196 case DXGI_FORMAT_BC7_TYPELESS:
197 case DXGI_FORMAT_BC7_UNORM:
198 case DXGI_FORMAT_BC7_UNORM_SRGB:
199 if ( fl < D3D_FEATURE_LEVEL_11_0 )
205 if ( metadata.
mipLevels > D3D11_REQ_MIP_LEVELS )
210 size_t iWidth = metadata.
width;
211 size_t iHeight = metadata.
height;
212 size_t iDepth = metadata.
depth;
215 UINT formatSupport = 0;
216 HRESULT hr = pDevice->CheckFormatSupport( fmt, &formatSupport );
225 if ( !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE1D) )
228 if ( (arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION)
229 || (iWidth > D3D11_REQ_TEXTURE1D_U_DIMENSION) )
232 if ( fl < D3D_FEATURE_LEVEL_11_0 )
234 if ( (arraySize > D3D10_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION)
235 || (iWidth > D3D10_REQ_TEXTURE1D_U_DIMENSION) )
238 if ( fl < D3D_FEATURE_LEVEL_10_0 )
240 if ( (arraySize > 1) || (iWidth > D3D_FL9_3_REQ_TEXTURE1D_U_DIMENSION) )
243 if ( (fl < D3D_FEATURE_LEVEL_9_3) && (iWidth > D3D_FL9_1_REQ_TEXTURE1D_U_DIMENSION ) )
252 if ( !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURECUBE) )
255 if ( (arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
256 || (iWidth > D3D11_REQ_TEXTURECUBE_DIMENSION)
257 || (iHeight > D3D11_REQ_TEXTURECUBE_DIMENSION))
260 if ( fl < D3D_FEATURE_LEVEL_11_0 )
262 if ( (arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
263 || (iWidth > D3D10_REQ_TEXTURECUBE_DIMENSION)
264 || (iHeight > D3D10_REQ_TEXTURECUBE_DIMENSION))
267 if ( (fl < D3D_FEATURE_LEVEL_10_1) && (arraySize != 6) )
270 if ( fl < D3D_FEATURE_LEVEL_10_0 )
272 if ( (iWidth > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION )
273 || (iHeight > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION ) )
276 if ( (fl < D3D_FEATURE_LEVEL_9_3)
277 && ( (iWidth > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION)
278 || (iHeight > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION) ) )
285 if ( !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE2D) )
288 if ( (arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
289 || (iWidth > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)
290 || (iHeight > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION))
293 if ( fl < D3D_FEATURE_LEVEL_11_0 )
295 if ( (arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION)
296 || (iWidth > D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION)
297 || (iHeight > D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION))
300 if ( fl < D3D_FEATURE_LEVEL_10_0 )
303 || (iWidth > D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION)
304 || (iHeight > D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION) )
307 if ( (fl < D3D_FEATURE_LEVEL_9_3)
308 && ( (iWidth > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION)
309 || (iHeight > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION) ) )
317 if ( !(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE3D) )
321 || (iWidth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
322 || (iHeight > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
323 || (iDepth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) )
326 if ( fl < D3D_FEATURE_LEVEL_11_0 )
328 if ( (iWidth > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
329 || (iHeight > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
330 || (iDepth > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) )
333 if ( fl < D3D_FEATURE_LEVEL_10_0 )
335 if ( (iWidth > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
336 || (iHeight > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)
337 || (iDepth > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) )
355 _Use_decl_annotations_
357 ID3D11Resource** ppResource )
360 D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0,
false,
364 _Use_decl_annotations_
366 D3D11_USAGE usage,
unsigned int bindFlags,
unsigned int cpuAccessFlags,
unsigned int miscFlags,
bool forceSRGB,
367 ID3D11Resource** ppResource )
369 if ( !pDevice || !srcImages || !nimages || !ppResource )
372 *ppResource =
nullptr;
378 if ( (metadata.
width > 0xFFFFFFFF) || (metadata.
height > 0xFFFFFFFF)
383 std::unique_ptr<D3D11_SUBRESOURCE_DATA[]> initData(
new (std::nothrow) D3D11_SUBRESOURCE_DATA[ metadata.
mipLevels * metadata.
arraySize ] );
385 return E_OUTOFMEMORY;
391 if ( !metadata.
depth )
395 if ( metadata.
depth > 0xFFFFFFFF )
401 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
403 size_t depth = metadata.
depth;
406 for(
size_t level = 0; level < metadata.
mipLevels; ++level )
409 if ( index >= nimages )
412 const Image& img = srcImages[ index ];
424 for(
size_t slice = 1; slice < depth; ++slice )
426 size_t tindex = metadata.
ComputeIndex( level, 0, slice );
427 if ( tindex >= nimages )
430 const Image& timg = srcImages[ tindex ];
435 if ( timg.
pixels != pSlice
446 initData[idx].pSysMem = img.
pixels;
447 initData[idx].SysMemPitch =
static_cast<DWORD
>( img.
rowPitch );
448 initData[idx].SysMemSlicePitch =
static_cast<DWORD
>( img.
slicePitch );
459 for(
size_t item = 0; item < metadata.
arraySize; ++item )
461 for(
size_t level = 0; level < metadata.
mipLevels; ++level )
464 if ( index >= nimages )
467 const Image& img = srcImages[ index ];
477 initData[idx].pSysMem = img.
pixels;
478 initData[idx].SysMemPitch =
static_cast<DWORD
>( img.
rowPitch );
479 initData[idx].SysMemSlicePitch =
static_cast<DWORD
>( img.
slicePitch );
494 D3D11_TEXTURE1D_DESC desc;
495 desc.Width =
static_cast<UINT
>( metadata.
width );
496 desc.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
497 desc.ArraySize =
static_cast<UINT
>( metadata.
arraySize );
498 desc.Format = tformat;
500 desc.BindFlags = bindFlags;
501 desc.CPUAccessFlags = cpuAccessFlags;
502 desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE;
504 hr = pDevice->CreateTexture1D( &desc, initData.get(),
reinterpret_cast<ID3D11Texture1D**
>(ppResource) );
510 D3D11_TEXTURE2D_DESC desc;
511 desc.Width =
static_cast<UINT
>( metadata.
width );
512 desc.Height =
static_cast<UINT
>( metadata.
height );
513 desc.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
514 desc.ArraySize =
static_cast<UINT
>( metadata.
arraySize );
515 desc.Format = tformat;
516 desc.SampleDesc.Count = 1;
517 desc.SampleDesc.Quality = 0;
519 desc.BindFlags = bindFlags;
520 desc.CPUAccessFlags = cpuAccessFlags;
522 desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE;
524 desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE;
526 hr = pDevice->CreateTexture2D( &desc, initData.get(),
reinterpret_cast<ID3D11Texture2D**
>(ppResource) );
532 D3D11_TEXTURE3D_DESC desc;
533 desc.Width =
static_cast<UINT
>( metadata.
width );
534 desc.Height =
static_cast<UINT
>( metadata.
height );
535 desc.Depth =
static_cast<UINT
>( metadata.
depth );
536 desc.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
537 desc.Format = tformat;
539 desc.BindFlags = bindFlags;
540 desc.CPUAccessFlags = cpuAccessFlags;
541 desc.MiscFlags = miscFlags & ~D3D11_RESOURCE_MISC_TEXTURECUBE;
543 hr = pDevice->CreateTexture3D( &desc, initData.get(),
reinterpret_cast<ID3D11Texture3D**
>(ppResource) );
555 _Use_decl_annotations_
557 ID3D11ShaderResourceView** ppSRV )
560 D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0,
false,
564 _Use_decl_annotations_
566 D3D11_USAGE usage,
unsigned int bindFlags,
unsigned int cpuAccessFlags,
unsigned int miscFlags,
bool forceSRGB,
567 ID3D11ShaderResourceView** ppSRV )
574 ComPtr<ID3D11Resource> resource;
576 usage, bindFlags, cpuAccessFlags, miscFlags, forceSRGB,
577 resource.GetAddressOf() );
583 D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
584 memset( &SRVDesc, 0,
sizeof(SRVDesc) );
588 SRVDesc.Format = metadata.
format;
595 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1DARRAY;
596 SRVDesc.Texture1DArray.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
597 SRVDesc.Texture1DArray.ArraySize =
static_cast<UINT
>( metadata.
arraySize );
601 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1D;
602 SRVDesc.Texture1D.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
612 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBEARRAY;
613 SRVDesc.TextureCubeArray.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
614 SRVDesc.TextureCubeArray.NumCubes =
static_cast<UINT
>( metadata.
arraySize / 6 );
618 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBE;
619 SRVDesc.TextureCube.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
624 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY;
625 SRVDesc.Texture2DArray.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
626 SRVDesc.Texture2DArray.ArraySize =
static_cast<UINT
>( metadata.
arraySize );
630 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
631 SRVDesc.Texture2D.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
637 SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE3D;
638 SRVDesc.Texture3D.MipLevels =
static_cast<UINT
>( metadata.
mipLevels );
645 hr = pDevice->CreateShaderResourceView( resource.Get(), &SRVDesc, ppSRV );
658 _Use_decl_annotations_
661 if ( !pDevice || !pContext || !pSource )
664 D3D11_RESOURCE_DIMENSION resType = D3D11_RESOURCE_DIMENSION_UNKNOWN;
665 pSource->GetType( &resType );
671 case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
673 ComPtr<ID3D11Texture1D> pTexture;
674 hr = pSource->QueryInterface( __uuidof(ID3D11Texture1D), reinterpret_cast<void**>( pTexture.GetAddressOf() ) );
680 D3D11_TEXTURE1D_DESC desc;
681 pTexture->GetDesc( &desc );
685 desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
686 desc.Usage = D3D11_USAGE_STAGING;
688 ComPtr<ID3D11Texture1D> pStaging;
689 hr = pDevice->CreateTexture1D( &desc, 0, pStaging.GetAddressOf() );
695 pContext->CopyResource( pStaging.Get(), pSource );
698 mdata.
width = desc.Width;
704 mdata.
format = desc.Format;
711 hr =
_Capture( pContext, pStaging.Get(), mdata, result );
715 case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
717 ComPtr<ID3D11Texture2D> pTexture;
718 hr = pSource->QueryInterface( __uuidof(ID3D11Texture2D), reinterpret_cast<void**>( pTexture.GetAddressOf() ) );
724 D3D11_TEXTURE2D_DESC desc;
725 pTexture->GetDesc( &desc );
727 ComPtr<ID3D11Texture2D> pStaging;
728 if ( desc.SampleDesc.Count > 1 )
730 desc.SampleDesc.Count = 1;
731 desc.SampleDesc.Quality = 0;
733 ComPtr<ID3D11Texture2D> pTemp;
734 hr = pDevice->CreateTexture2D( &desc, 0, pTemp.GetAddressOf() );
740 DXGI_FORMAT fmt = desc.Format;
749 hr = pDevice->CheckFormatSupport( fmt, &support );
753 if ( !(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE) )
759 for( UINT item = 0; item < desc.ArraySize; ++item )
761 for( UINT level = 0; level < desc.MipLevels; ++level )
763 UINT index = D3D11CalcSubresource( level, item, desc.MipLevels );
764 pContext->ResolveSubresource( pTemp.Get(), index, pSource, index, fmt );
769 desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE;
770 desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
771 desc.Usage = D3D11_USAGE_STAGING;
773 hr = pDevice->CreateTexture2D( &desc, 0, pStaging.GetAddressOf() );
779 pContext->CopyResource( pStaging.Get(), pTemp.Get() );
784 desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE;
785 desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
786 desc.Usage = D3D11_USAGE_STAGING;
788 hr = pDevice->CreateTexture2D( &desc, 0, &pStaging );
794 pContext->CopyResource( pStaging.Get(), pSource );
798 mdata.
width = desc.Width;
799 mdata.
height = desc.Height;
805 mdata.
format = desc.Format;
812 hr =
_Capture( pContext, pStaging.Get(), mdata, result );
816 case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
818 ComPtr<ID3D11Texture3D> pTexture;
819 hr = pSource->QueryInterface( __uuidof(ID3D11Texture3D), reinterpret_cast<void**>( pTexture.GetAddressOf() ) );
825 D3D11_TEXTURE3D_DESC desc;
826 pTexture->GetDesc( &desc );
830 desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
831 desc.Usage = D3D11_USAGE_STAGING;
833 ComPtr<ID3D11Texture3D> pStaging;
834 hr = pDevice->CreateTexture3D( &desc, 0, pStaging.GetAddressOf() );
840 pContext->CopyResource( pStaging.Get(), pSource );
843 mdata.
width = desc.Width;
844 mdata.
height = desc.Height;
845 mdata.
depth = desc.Depth;
850 mdata.
format = desc.Format;
857 hr =
_Capture( pContext, pStaging.Get(), mdata, result );
HRESULT CreateShaderResourceViewEx(_In_ ID3D11Device *pDevice, _In_reads_(nimages) const Image *srcImages, _In_ size_t nimages, _In_ const TexMetadata &metadata, _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ bool forceSRGB, _Outptr_ ID3D11ShaderResourceView **ppSRV)
size_t _In_ DXGI_FORMAT size_t _In_ TEXP_LEGACY_FORMAT _In_ DWORD flags assert(pDestination &&outSize > 0)
HRESULT Initialize(_In_ const TexMetadata &mdata, _In_ DWORD flags=CP_FLAGS_NONE)
static HRESULT _Capture(_In_ ID3D11DeviceContext *pContext, _In_ ID3D11Resource *pSource, _In_ const TexMetadata &metadata, _In_ const ScratchImage &result)
HRESULT CaptureTexture(_In_ ID3D11Device *pDevice, _In_ ID3D11DeviceContext *pContext, _In_ ID3D11Resource *pSource, _Out_ ScratchImage &result)
_In_ size_t _In_ const TexMetadata & metadata
DXGI_FORMAT MakeTypelessUNORM(_In_ DXGI_FORMAT fmt)
bool IsValid(_In_ DXGI_FORMAT fmt)
HRESULT CreateTexture(_In_ ID3D11Device *pDevice, _In_reads_(nimages) const Image *srcImages, _In_ size_t nimages, _In_ const TexMetadata &metadata, _Outptr_ ID3D11Resource **ppResource)
HRESULT CreateShaderResourceView(_In_ ID3D11Device *pDevice, _In_reads_(nimages) const Image *srcImages, _In_ size_t nimages, _In_ const TexMetadata &metadata, _Outptr_ ID3D11ShaderResourceView **ppSRV)
bool IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless=true)
DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT fmt)
DXGI_FORMAT MakeTypelessFLOAT(_In_ DXGI_FORMAT fmt)
HRESULT CreateTextureEx(_In_ ID3D11Device *pDevice, _In_reads_(nimages) const Image *srcImages, _In_ size_t nimages, _In_ const TexMetadata &metadata, _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ bool forceSRGB, _Outptr_ ID3D11Resource **ppResource)
bool IsSupportedTexture(_In_ ID3D11Device *pDevice, _In_ const TexMetadata &metadata)
size_t ComputeScanlines(_In_ DXGI_FORMAT fmt, _In_ size_t height)