DirectXTex: cleanup of volume map custom point/box filters

This commit is contained in:
walbourn_cp 2013-04-26 15:11:42 -07:00
parent 35dfd5523d
commit e95ffd151d

View File

@ -566,10 +566,14 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
if ( depth > 1 ) if ( depth > 1 )
{ {
// 3D point filter // 3D point filter
for( size_t slice=0; slice < depth; slice += 2 ) size_t ndepth = depth >> 1;
for( size_t slice=0; slice < ndepth; ++slice )
{ {
const Image* src = mipChain.GetImage( level-1, 0, slice ); size_t slicesrc = std::min<size_t>( slice * 2, depth-1 );
const Image* dest = mipChain.GetImage( level, 0, slice >> 1 );
const Image* src = mipChain.GetImage( level-1, 0, slicesrc );
const Image* dest = mipChain.GetImage( level, 0, slice );
if ( !src || !dest ) if ( !src || !dest )
return E_POINTER; return E_POINTER;
@ -579,6 +583,7 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
size_t rowPitch = src->rowPitch; size_t rowPitch = src->rowPitch;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
size_t nheight = (height > 1) ? (height >> 1) : 1; size_t nheight = (height > 1) ? (height >> 1) : 1;
for( size_t y = 0; y < nheight; ++y ) for( size_t y = 0; y < nheight; ++y )
@ -587,11 +592,9 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
return E_FAIL; return E_FAIL;
pSrc += rowPitch*2; pSrc += rowPitch*2;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
for( size_t x = 0; x < nwidth; ++x ) for( size_t x = 0; x < nwidth; ++x )
{ {
target[ x ] = row[ x*2 ]; target[ x ] = row[ x << 1 ];
} }
if ( !_StoreScanline( pDest, dest->rowPitch, dest->format, target, nwidth ) ) if ( !_StoreScanline( pDest, dest->rowPitch, dest->format, target, nwidth ) )
@ -614,6 +617,7 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
size_t rowPitch = src->rowPitch; size_t rowPitch = src->rowPitch;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
size_t nheight = (height > 1) ? (height >> 1) : 1; size_t nheight = (height > 1) ? (height >> 1) : 1;
for( size_t y = 0; y < nheight; ++y ) for( size_t y = 0; y < nheight; ++y )
@ -622,11 +626,9 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
return E_FAIL; return E_FAIL;
pSrc += rowPitch*2; pSrc += rowPitch*2;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
for( size_t x = 0; x < nwidth; ++x ) for( size_t x = 0; x < nwidth; ++x )
{ {
target[ x ] = row[ x*2 ]; target[ x ] = row[ x << 1 ];
} }
if ( !_StoreScanline( pDest, dest->rowPitch, dest->format, target, nwidth ) ) if ( !_StoreScanline( pDest, dest->rowPitch, dest->format, target, nwidth ) )
@ -645,8 +647,6 @@ static HRESULT _Generate3DMipsPointFilter( _In_ size_t depth, _In_ size_t levels
depth >>= 1; depth >>= 1;
} }
assert( height == 1 && width == 1 && depth == 1 );
return S_OK; return S_OK;
} }
@ -684,13 +684,13 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
// Resize base image to each target mip level // Resize base image to each target mip level
for( size_t level=1; level < levels; ++level ) for( size_t level=1; level < levels; ++level )
{ {
if ( height == 1) if ( height <= 1)
{ {
urow0 = vrow0; urow1 = urow0;
urow1 = vrow1; vrow1 = vrow0;
} }
if ( width == 1 ) if ( width <= 1 )
{ {
urow2 = urow0; urow2 = urow0;
urow3 = urow1; urow3 = urow1;
@ -701,11 +701,16 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
if ( depth > 1 ) if ( depth > 1 )
{ {
// 3D box filter // 3D box filter
for( size_t slice=0; slice < depth; slice += 2 ) size_t ndepth = depth >> 1;
for( size_t slice=0; slice < ndepth; ++slice )
{ {
const Image* srca = mipChain.GetImage( level-1, 0, slice ); size_t slicea = std::min<size_t>( slice * 2, depth-1 );
const Image* srcb = mipChain.GetImage( level-1, 0, slice+1 ); size_t sliceb = std::min<size_t>( slicea + 1, depth-1 );
const Image* dest = mipChain.GetImage( level, 0, slice >> 1 );
const Image* srca = mipChain.GetImage( level-1, 0, slicea );
const Image* srcb = mipChain.GetImage( level-1, 0, sliceb );
const Image* dest = mipChain.GetImage( level, 0, slice );
if ( !srca || !srcb || !dest ) if ( !srca || !srcb || !dest )
return E_POINTER; return E_POINTER;
@ -717,6 +722,7 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
size_t aRowPitch = srca->rowPitch; size_t aRowPitch = srca->rowPitch;
size_t bRowPitch = srcb->rowPitch; size_t bRowPitch = srcb->rowPitch;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
size_t nheight = (height > 1) ? (height >> 1) : 1; size_t nheight = (height > 1) ? (height >> 1) : 1;
for( size_t y = 0; y < nheight; ++y ) for( size_t y = 0; y < nheight; ++y )
@ -732,25 +738,20 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
pSrc1 += aRowPitch; pSrc1 += aRowPitch;
} }
if ( urow0 != vrow0 ) if ( !_LoadScanline( vrow0, width, pSrc2, bRowPitch, srcb->format ) )
{ return E_FAIL;
if ( !_LoadScanline( vrow0, width, pSrc2, bRowPitch, srcb->format ) ) pSrc2 += bRowPitch;
return E_FAIL;
pSrc2 += bRowPitch;
}
if ( urow0 != vrow1 && vrow0 != vrow1 ) if ( vrow0 != vrow1 )
{ {
if ( !_LoadScanline( vrow1, width, pSrc2, bRowPitch, srcb->format ) ) if ( !_LoadScanline( vrow1, width, pSrc2, bRowPitch, srcb->format ) )
return E_FAIL; return E_FAIL;
pSrc2 += bRowPitch; pSrc2 += bRowPitch;
} }
size_t nwidth = (width > 1) ? (width >> 1) : 1;
for( size_t x = 0; x < nwidth; ++x ) for( size_t x = 0; x < nwidth; ++x )
{ {
size_t x2 = x*2; size_t x2 = x << 1;
// Box filter: Average 2x2x2 pixels // Box filter: Average 2x2x2 pixels
XMVECTOR v = XMVectorAdd( urow0[ x2 ], urow1[ x2 ] ); XMVECTOR v = XMVectorAdd( urow0[ x2 ], urow1[ x2 ] );
@ -784,6 +785,7 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
size_t rowPitch = src->rowPitch; size_t rowPitch = src->rowPitch;
size_t nwidth = (width > 1) ? (width >> 1) : 1;
size_t nheight = (height > 1) ? (height >> 1) : 1; size_t nheight = (height > 1) ? (height >> 1) : 1;
for( size_t y = 0; y < nheight; ++y ) for( size_t y = 0; y < nheight; ++y )
@ -799,11 +801,9 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
pSrc += rowPitch; pSrc += rowPitch;
} }
size_t nwidth = (width > 1) ? (width >> 1) : 1;
for( size_t x = 0; x < nwidth; ++x ) for( size_t x = 0; x < nwidth; ++x )
{ {
size_t x2 = x*2; size_t x2 = x << 1;
// Box filter: Average 2x2 pixels // Box filter: Average 2x2 pixels
XMVECTOR v = XMVectorAdd( urow0[ x2 ], urow1[ x2 ] ); XMVECTOR v = XMVectorAdd( urow0[ x2 ], urow1[ x2 ] );
@ -829,8 +829,6 @@ static HRESULT _Generate3DMipsBoxFilter( _In_ size_t depth, _In_ size_t levels,
depth >>= 1; depth >>= 1;
} }
assert( height == 1 && width == 1 && depth == 1 );
return S_OK; return S_OK;
} }
@ -1005,7 +1003,7 @@ HRESULT GenerateMipMaps( const Image* srcImages, size_t nimages, const TexMetada
break; break;
default: default:
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );; return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
} }
} }
@ -1083,7 +1081,7 @@ HRESULT GenerateMipMaps3D( const Image* baseImages, size_t depth, DWORD filter,
return E_NOTIMPL; return E_NOTIMPL;
default: default:
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );; return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
} }
} }
@ -1161,7 +1159,7 @@ HRESULT GenerateMipMaps3D( const Image* srcImages, size_t nimages, const TexMeta
return E_NOTIMPL; return E_NOTIMPL;
default: default:
return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );; return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED );
} }
} }