37 if ( !srcImage.pixels )
40 DXGI_FORMAT
format = srgb ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB : DXGI_FORMAT_R8G8B8A8_UNORM;
42 HRESULT hr = image.Initialize2D( format, srcImage.width, srcImage.height, 1, 1 );
46 const Image *img = image.GetImage( 0, 0, 0 );
60 ScopedAlignedArrayXMVECTOR scanline( reinterpret_cast<XMVECTOR*>( _aligned_malloc( (
sizeof(XMVECTOR) * srcImage.width ), 16 ) ) );
67 const uint8_t *pSrc = srcImage.pixels;
68 for(
size_t h = 0; h < srcImage.height; ++h )
70 if ( !
_LoadScanline( scanline.get(), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format ) )
84 pSrc += srcImage.rowPitch;
119 for(
size_t h = 0; h < srcImage.
height; ++h )
145 assert( srcImage.pixels && destImage.pixels );
147 DXGI_FORMAT
format = gpubc->GetSourceFormat();
149 if ( srcImage.format == format )
152 return gpubc->Compress( srcImage, destImage );
164 case DXGI_FORMAT_R8G8B8A8_UNORM:
168 case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
172 case DXGI_FORMAT_R32G32B32A32_FLOAT:
188 return gpubc->Compress( *img, destImage );
200 _Use_decl_annotations_
208 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
211 std::unique_ptr<GPUCompressBC> gpubc(
new (std::nothrow)
GPUCompressBC );
213 return E_OUTOFMEMORY;
215 HRESULT hr = gpubc->Initialize( pDevice );
219 hr = gpubc->Prepare( srcImage.
width, srcImage.
height, format, alphaWeight );
235 hr =
_GPUCompress( gpubc.get(), srcImage, *img, compress );
242 _Use_decl_annotations_
246 if ( !pDevice || !srcImages || !nimages )
254 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
259 std::unique_ptr<GPUCompressBC> gpubc(
new (std::nothrow)
GPUCompressBC );
261 return E_OUTOFMEMORY;
263 HRESULT hr = gpubc->Initialize( pDevice );
293 size_t w = metadata.
width;
294 size_t h = metadata.
height;
296 for(
size_t level=0; level < metadata.
mipLevels; ++level )
298 hr = gpubc->Prepare( w, h, format, alphaWeight );
305 for(
size_t item = 0; item < metadata.
arraySize; ++item )
308 if ( index >= nimages )
314 assert( dest[ index ].format == format );
316 const Image& src = srcImages[ index ];
324 hr =
_GPUCompress( gpubc.get(), src, dest[ index ], compress );
343 size_t w = metadata.
width;
344 size_t h = metadata.
height;
345 size_t d = metadata.
depth;
347 for(
size_t level=0; level < metadata.
mipLevels; ++level )
349 hr = gpubc->Prepare( w, h, format, alphaWeight );
356 for(
size_t slice=0; slice < d; ++slice )
358 size_t index = metadata.
ComputeIndex( level, 0, slice );
359 if ( index >= nimages )
365 assert( dest[ index ].format == format );
367 const Image& src = srcImages[ index ];
375 hr =
_GPUCompress( gpubc.get(), src, dest[ index ], compress );
396 return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
std::unique_ptr< DirectX::XMVECTOR, aligned_deleter > ScopedAlignedArrayXMVECTOR
const Image * GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const
bool IsPlanar(_In_ DXGI_FORMAT fmt)
static HRESULT _ConvertToRGBA32(_In_ const Image &srcImage, _In_ ScratchImage &image, bool srgb, _In_ DWORD filter)
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)
HRESULT Initialize2D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ DWORD flags=CP_FLAGS_NONE)
_Use_decl_annotations_ bool _LoadScanline(XMVECTOR *pDestination, size_t count, LPCVOID pSource, size_t size, DXGI_FORMAT format)
static HRESULT _ConvertToRGBAF32(const Image &srcImage, ScratchImage &image, _In_ DWORD filter)
bool IsCompressed(_In_ DXGI_FORMAT fmt)
size_t GetImageCount() const
static DWORD _GetSRGBFlags(_In_ DWORD compress)
_In_ size_t _In_ const TexMetadata & metadata
_Use_decl_annotations_ void _ConvertScanline(XMVECTOR *pBuffer, size_t count, DXGI_FORMAT outFormat, DXGI_FORMAT inFormat, DWORD flags)
bool IsPalettized(_In_ DXGI_FORMAT fmt)
bool IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless=true)
_In_ size_t _In_ size_t _In_ DXGI_FORMAT format
static HRESULT _GPUCompress(_In_ GPUCompressBC *gpubc, _In_ const Image &srcImage, _In_ const Image &destImage, _In_ DWORD compress)
const Image * GetImages() const
HRESULT Compress(_In_ const Image &srcImage, _In_ DXGI_FORMAT format, _In_ DWORD compress, _In_ float alphaRef, _Out_ ScratchImage &cImage)
_Use_decl_annotations_ bool _StoreScanline(LPVOID pDestination, size_t size, DXGI_FORMAT format, const XMVECTOR *pSource, size_t count, float threshold)