Use XMVectorMultiplyAdd in diffusion dither

This commit is contained in:
Chuck Walbourn 2017-11-15 19:57:40 -08:00
parent b7e829b108
commit 9bac14c9b9

View File

@ -3661,9 +3661,9 @@ namespace
if (norm) vError = XMVectorDivide( vError, scalev ); \ if (norm) vError = XMVectorDivide( vError, scalev ); \
\ \
/* Distribute error to next scanline and next pixel */ \ /* Distribute error to next scanline and next pixel */ \
pDiffusionErrors[ index-delta ] += XMVectorMultiply( g_ErrorWeight3, vError ); \ pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd( g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ] ); \
pDiffusionErrors[ index+1 ] += XMVectorMultiply( g_ErrorWeight5, vError ); \ pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd( g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ] ); \
pDiffusionErrors[ index+2+delta ] += XMVectorMultiply( g_ErrorWeight1, vError ); \ pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd( g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ] ); \
vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \ vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \
} \ } \
else \ else \
@ -3716,9 +3716,9 @@ namespace
if (norm) vError = XMVectorDivide( vError, scalev ); \ if (norm) vError = XMVectorDivide( vError, scalev ); \
\ \
/* Distribute error to next scanline and next pixel */ \ /* Distribute error to next scanline and next pixel */ \
pDiffusionErrors[ index-delta ] += XMVectorMultiply( g_ErrorWeight3, vError ); \ pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd( g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ] ); \
pDiffusionErrors[ index+1 ] += XMVectorMultiply( g_ErrorWeight5, vError ); \ pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd( g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ] ); \
pDiffusionErrors[ index+2+delta ] += XMVectorMultiply( g_ErrorWeight1, vError ); \ pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd( g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ] ); \
vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \ vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \
} \ } \
else \ else \
@ -3769,9 +3769,9 @@ namespace
if (norm) vError = XMVectorDivide( vError, scalev ); \ if (norm) vError = XMVectorDivide( vError, scalev ); \
\ \
/* Distribute error to next scanline and next pixel */ \ /* Distribute error to next scanline and next pixel */ \
pDiffusionErrors[ index-delta ] += XMVectorMultiply( g_ErrorWeight3, vError ); \ pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd( g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ] ); \
pDiffusionErrors[ index+1 ] += XMVectorMultiply( g_ErrorWeight5, vError ); \ pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd( g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ] ); \
pDiffusionErrors[ index+2+delta ] += XMVectorMultiply( g_ErrorWeight1, vError ); \ pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd( g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ] ); \
vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \ vError = XMVectorMultiply( vError, g_ErrorWeight7 ); \
} \ } \
else \ else \
@ -3897,9 +3897,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, Scale); vError = XMVectorDivide(vError, Scale);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else
@ -3976,9 +3976,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, Scale); vError = XMVectorDivide(vError, Scale);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else
@ -4064,9 +4064,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, g_Scale565pc); vError = XMVectorDivide(vError, g_Scale565pc);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else
@ -4113,9 +4113,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, g_Scale5551pc); vError = XMVectorDivide(vError, g_Scale5551pc);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else
@ -4168,9 +4168,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, g_Scale8pc); vError = XMVectorDivide(vError, g_Scale8pc);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else
@ -4223,9 +4223,9 @@ bool DirectX::_StoreScanlineDither(
vError = XMVectorDivide(vError, g_Scale4pc); vError = XMVectorDivide(vError, g_Scale4pc);
// Distribute error to next scanline and next pixel // Distribute error to next scanline and next pixel
pDiffusionErrors[index - delta] += XMVectorMultiply(g_ErrorWeight3, vError); pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]);
pDiffusionErrors[index + 1] += XMVectorMultiply(g_ErrorWeight5, vError); pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]);
pDiffusionErrors[index + 2 + delta] += XMVectorMultiply(g_ErrorWeight1, vError); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]);
vError = XMVectorMultiply(vError, g_ErrorWeight7); vError = XMVectorMultiply(vError, g_ErrorWeight7);
} }
else else