1
0
mirror of https://github.com/microsoft/DirectXTex synced 2024-11-29 15:41:04 +00:00
This commit is contained in:
Chuck Walbourn 2018-07-03 19:00:32 -07:00
commit a884753044
12 changed files with 10052 additions and 9664 deletions

View File

@ -680,16 +680,16 @@ void TryMode137CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
if (1 == g_mode_id) if (1 == g_mode_id)
{ {
// in mode 1, there is only one p bit per subset // in mode 1, there is only one p bit per subset
max_p = 4; max_p = 2;
} }
else else
{ {
// in mode 3 7, there are two p bits per subset, one for each end point // in mode 3 7, there are two p bits per subset, one for each end point
max_p = 16; max_p = 4;
} }
uint rotation = 0; uint final_p[2] = { 0, 0 };
uint error = MAX_UINT; uint error[2] = { MAX_UINT, MAX_UINT };
for ( uint p = 0; p < max_p; p ++ ) for ( uint p = 0; p < max_p; p ++ )
{ {
endPoint[0] = endPointBackup[0]; endPoint[0] = endPointBackup[0];
@ -699,15 +699,15 @@ void TryMode137CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
{ {
if (g_mode_id == 1) if (g_mode_id == 1)
{ {
compress_endpoints1( endPoint[i], (p >> i) & 1 ); compress_endpoints1( endPoint[i], p );
} }
else if (g_mode_id == 3) else if (g_mode_id == 3)
{ {
compress_endpoints3( endPoint[i], uint2(p >> (i * 2 + 0), p >> (i * 2 + 1)) & 1 ); compress_endpoints3( endPoint[i], uint2(p, p >> 1) & 1 );
} }
else if (g_mode_id == 7) else if (g_mode_id == 7)
{ {
compress_endpoints7( endPoint[i], uint2(p >> (i * 2 + 0), p >> (i * 2 + 1)) & 1 ); compress_endpoints7( endPoint[i], uint2(p, p >> 1) & 1 );
} }
} }
@ -748,10 +748,12 @@ void TryMode137CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
step_selector = 1; // mode 1 has 3 bit index step_selector = 1; // mode 1 has 3 bit index
} }
uint p_error = 0; uint p_error[2] = { 0, 0 };
for ( i = 0; i < 16; i ++ ) for ( i = 0; i < 16; i ++ )
{ {
if (((bits >> i) & 0x01) == 1) uint subset_index = (bits >> i) & 0x01;
if (subset_index == 1)
{ {
dotProduct = dot( span[1], shared_temp[threadBase + i].pixel - endPoint[1][0] ); dotProduct = dot( span[1], shared_temp[threadBase + i].pixel - endPoint[1][0] );
color_index = (span_norm_sqr[1] <= 0 || dotProduct <= 0) ? 0 color_index = (span_norm_sqr[1] <= 0 || dotProduct <= 0) ? 0
@ -764,8 +766,6 @@ void TryMode137CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
: ((dotProduct < span_norm_sqr[0]) ? aStep[step_selector][uint(dotProduct * 63.49999 / span_norm_sqr[0])] : aStep[step_selector][63]); : ((dotProduct < span_norm_sqr[0]) ? aStep[step_selector][uint(dotProduct * 63.49999 / span_norm_sqr[0])] : aStep[step_selector][63]);
} }
uint subset_index = (bits >> i) & 0x01;
pixel_r = ((64 - aWeight[step_selector][color_index]) * endPoint[subset_index][0] pixel_r = ((64 - aWeight[step_selector][color_index]) * endPoint[subset_index][0]
+ aWeight[step_selector][color_index] * endPoint[subset_index][1] + 32) >> 6; + aWeight[step_selector][color_index] * endPoint[subset_index][1] + 32) >> 6;
if (g_mode_id != 7) if (g_mode_id != 7)
@ -776,20 +776,32 @@ void TryMode137CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
uint4 pixel = shared_temp[threadBase + i].pixel; uint4 pixel = shared_temp[threadBase + i].pixel;
Ensure_A_Is_Larger( pixel_r, pixel ); Ensure_A_Is_Larger( pixel_r, pixel );
pixel_r -= pixel; pixel_r -= pixel;
p_error += ComputeError(pixel_r, pixel_r); uint pixel_error = ComputeError(pixel_r, pixel_r);
if ( subset_index == 1 )
p_error[1] += pixel_error;
else
p_error[0] += pixel_error;
} }
if (p_error < error) for ( i = 0; i < 2; i++ )
{ {
error = p_error; if (p_error[i] < error[i])
rotation = p; {
error[i] = p_error[i];
final_p[i] = p;
}
} }
} }
shared_temp[GI].error = error; shared_temp[GI].error = error[0] + error[1];
shared_temp[GI].mode = g_mode_id; shared_temp[GI].mode = g_mode_id;
shared_temp[GI].partition = partition; shared_temp[GI].partition = partition;
shared_temp[GI].rotation = rotation; // mode 1 3 7 don't have rotation, we use rotation for p bits
// mode 1 3 7 don't have rotation, we use rotation for p bits
if ( g_mode_id == 1 )
shared_temp[GI].rotation = (final_p[1] << 1) | final_p[0];
else
shared_temp[GI].rotation = (final_p[1] << 2) | final_p[0];
} }
GroupMemoryBarrierWithGroupSync(); GroupMemoryBarrierWithGroupSync();
@ -955,15 +967,15 @@ void TryMode02CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
uint max_p; uint max_p;
if (0 == g_mode_id) if (0 == g_mode_id)
{ {
max_p = 64; // changed from 32 to 64 max_p = 4;
} }
else else
{ {
max_p = 1; max_p = 1;
} }
uint rotation = 0; uint final_p[3] = { 0, 0, 0 };
uint error = MAX_UINT; uint error[3] = { MAX_UINT, MAX_UINT, MAX_UINT };
for ( uint p = 0; p < max_p; p ++ ) for ( uint p = 0; p < max_p; p ++ )
{ {
endPoint[0] = endPointBackup[0]; endPoint[0] = endPointBackup[0];
@ -974,7 +986,7 @@ void TryMode02CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
{ {
if (0 == g_mode_id) if (0 == g_mode_id)
{ {
compress_endpoints0( endPoint[i], uint2(p >> (i * 2 + 0), p >> (i * 2 + 1)) & 1 ); compress_endpoints0( endPoint[i], uint2(p, p >> 1) & 1 );
} }
else else
{ {
@ -1006,7 +1018,7 @@ void TryMode02CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
} }
} }
uint p_error = 0; uint p_error[3] = { 0, 0, 0 };
for ( i = 0; i < 16; i ++ ) for ( i = 0; i < 16; i ++ )
{ {
uint subset_index = ( bits2 >> ( i * 2 ) ) & 0x03; uint subset_index = ( bits2 >> ( i * 2 ) ) & 0x03;
@ -1036,19 +1048,30 @@ void TryMode02CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID ) // mode
uint4 pixel = shared_temp[threadBase + i].pixel; uint4 pixel = shared_temp[threadBase + i].pixel;
Ensure_A_Is_Larger( pixel_r, pixel ); Ensure_A_Is_Larger( pixel_r, pixel );
pixel_r -= pixel; pixel_r -= pixel;
p_error += ComputeError(pixel_r, pixel_r);
uint pixel_error = ComputeError(pixel_r, pixel_r);
if ( subset_index == 2 )
p_error[2] += pixel_error;
else if ( subset_index == 1 )
p_error[1] += pixel_error;
else
p_error[0] += pixel_error;
} }
if (p_error < error) for ( i = 0; i < 3; i++ )
{ {
error = p_error; if (p_error[i] < error[i])
rotation = p; // Borrow rotation for p {
error[i] = p_error[i];
final_p[i] = p; // Borrow rotation for p
}
} }
} }
shared_temp[GI].error = error; shared_temp[GI].error = error[0] + error[1] + error[2];
shared_temp[GI].partition = partition; shared_temp[GI].partition = partition;
shared_temp[GI].rotation = rotation; shared_temp[GI].rotation = (final_p[2] << 4) | (final_p[1] << 2) | final_p[0];
} }
GroupMemoryBarrierWithGroupSync(); GroupMemoryBarrierWithGroupSync();
@ -1562,8 +1585,7 @@ void EncodeBlockCS(uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID)
uint4 quantize( uint4 color, uint uPrec ) uint4 quantize( uint4 color, uint uPrec )
{ {
uint4 rnd = min(255, color + (1 << (7 - uPrec))); return (((color << 8) + color) * ((1 << uPrec) - 1) + 32768) >> 16;
return rnd >> (8 - uPrec);
} }
uint4 unquantize( uint4 color, uint uPrec ) uint4 unquantize( uint4 color, uint uPrec )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff