crossxtex/DirectXTex/Shaders/BC6HEncode.hlsl

2567 lines
120 KiB
HLSL
Raw Normal View History

//--------------------------------------------------------------------------------------
// File: BC6HEncode.hlsl
//
// The Compute Shader for BC6H Encoder
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------
//#define REF_DEVICE
#define UINTLENGTH 32
#define NCHANNELS 3
#define SIGNED_F16 96
#define UNSIGNED_F16 95
#define MAX_FLOAT asfloat(0x7F7FFFFF)
#define MIN_FLOAT asfloat(0xFF7FFFFF)
#define MAX_INT asint(0x7FFFFFFF)
#define MIN_INT asint(0x80000000)
cbuffer cbCS : register( b0 )
{
uint g_tex_width;
uint g_num_block_x;
uint g_format; //either SIGNED_F16 for DXGI_FORMAT_BC6H_SF16 or UNSIGNED_F16 for DXGI_FORMAT_BC6H_UF16
uint g_mode_id;
uint g_start_block_id;
uint g_num_total_blocks;
};
static const uint candidateModeMemory[14] = { 0x00, 0x01, 0x02, 0x06, 0x0A, 0x0E, 0x12, 0x16, 0x1A, 0x1E, 0x03, 0x07, 0x0B, 0x0F };
static const uint candidateModeFlag[14] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
static const bool candidateModeTransformed[14] = { true, true, true, true, true, true, true, true, true, false, false, true, true, true };
static const uint4 candidateModePrec[14] = { uint4(10,5,5,5), uint4(7,6,6,6),
uint4(11,5,4,4), uint4(11,4,5,4), uint4(11,4,4,5), uint4(9,5,5,5),
uint4(8,6,5,5), uint4(8,5,6,5), uint4(8,5,5,6), uint4(6,6,6,6),
uint4(10,10,10,10), uint4(11,9,9,9), uint4(12,8,8,8), uint4(16,4,4,4) };
/*static const uint4x4 candidateSection[32] =
{
{0,0,1,1, 0,0,1,1, 0,0,1,1, 0,0,1,1}, {0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1}, {0,1,1,1, 0,1,1,1, 0,1,1,1, 0,1,1,1}, {0,0,0,1, 0,0,1,1, 0,0,1,1, 0,1,1,1},
{0,0,0,0, 0,0,0,1, 0,0,0,1, 0,0,1,1}, {0,0,1,1, 0,1,1,1, 0,1,1,1, 1,1,1,1}, {0,0,0,1, 0,0,1,1, 0,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,1, 0,0,1,1, 0,1,1,1},
{0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,1,1}, {0,0,1,1, 0,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,1, 0,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,1, 0,1,1,1},
{0,0,0,1, 0,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 1,1,1,1, 1,1,1,1, 1,1,1,1}, {0,0,0,0, 0,0,0,0, 0,0,0,0, 1,1,1,1},
{0,0,0,0, 1,0,0,0, 1,1,1,0, 1,1,1,1}, {0,1,1,1, 0,0,0,1, 0,0,0,0, 0,0,0,0}, {0,0,0,0, 0,0,0,0, 1,0,0,0, 1,1,1,0}, {0,1,1,1, 0,0,1,1, 0,0,0,1, 0,0,0,0},
{0,0,1,1, 0,0,0,1, 0,0,0,0, 0,0,0,0}, {0,0,0,0, 1,0,0,0, 1,1,0,0, 1,1,1,0}, {0,0,0,0, 0,0,0,0, 1,0,0,0, 1,1,0,0}, {0,1,1,1, 0,0,1,1, 0,0,1,1, 0,0,0,1},
{0,0,1,1, 0,0,0,1, 0,0,0,1, 0,0,0,0}, {0,0,0,0, 1,0,0,0, 1,0,0,0, 1,1,0,0}, {0,1,1,0, 0,1,1,0, 0,1,1,0, 0,1,1,0}, {0,0,1,1, 0,1,1,0, 0,1,1,0, 1,1,0,0},
{0,0,0,1, 0,1,1,1, 1,1,1,0, 1,0,0,0}, {0,0,0,0, 1,1,1,1, 1,1,1,1, 0,0,0,0}, {0,1,1,1, 0,0,0,1, 1,0,0,0, 1,1,1,0}, {0,0,1,1, 1,0,0,1, 1,0,0,1, 1,1,0,0}
};*/
static const uint candidateSectionBit[32] =
{
0xCCCC, 0x8888, 0xEEEE, 0xECC8,
0xC880, 0xFEEC, 0xFEC8, 0xEC80,
0xC800, 0xFFEC, 0xFE80, 0xE800,
0xFFE8, 0xFF00, 0xFFF0, 0xF000,
0xF710, 0x008E, 0x7100, 0x08CE,
0x008C, 0x7310, 0x3100, 0x8CCE,
0x088C, 0x3110, 0x6666, 0x366C,
0x17E8, 0x0FF0, 0x718E, 0x399C
};
static const uint candidateFixUpIndex1D[32] =
{
15,15,15,15,
15,15,15,15,
15,15,15,15,
15,15,15,15,
15, 2, 8, 2,
2, 8, 8,15,
2, 8, 2, 2,
8, 8, 2, 2
};
//0, 9, 18, 27, 37, 46, 55, 64
static const uint aStep1[64] = {0,0,0,0,0,1,1,1,
1,1,1,1,1,1,2,2,
2,2,2,2,2,2,2,3,
3,3,3,3,3,3,3,3,
3,4,4,4,4,4,4,4,
4,4,5,5,5,5,5,5,
5,5,5,6,6,6,6,6,
6,6,6,6,7,7,7,7};
//0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64
static const uint aStep2[64] = { 0, 0, 0, 1, 1, 1, 1, 2,
2, 2, 2, 2, 3, 3, 3, 3,
4, 4, 4, 4, 5, 5, 5, 5,
6, 6, 6, 6, 6, 7, 7, 7,
7, 8, 8, 8, 8, 9, 9, 9,
9,10,10,10,10,10,11,11,
11,11,12,12,12,12,13,13,
13,13,14,14,14,14,15,15};
static const float3 RGB2LUM = float3(0.2126f, 0.7152f, 0.0722f);
#define THREAD_GROUP_SIZE 64
#define BLOCK_SIZE_Y 4
#define BLOCK_SIZE_X 4
#define BLOCK_SIZE (BLOCK_SIZE_Y * BLOCK_SIZE_X)
//Forward declaration
uint3 float2half( float3 pixel_f );
int3 start_quantize( uint3 pixel_h );
void quantize( inout int2x3 endPoint, uint prec );
void finish_quantize_0( inout int bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed );
void finish_quantize_1( inout int bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed );
void finish_quantize( out bool bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed );
void start_unquantize( inout int2x3 endPoint[2], uint4 prec, bool transformed );
void start_unquantize( inout int2x3 endPoint, uint4 prec, bool transformed );
void unquantize( inout int2x3 color, uint prec );
uint3 finish_unquantize( int3 color );
void generate_palette_unquantized8( out uint3 palette, int3 low, int3 high, int i );
void generate_palette_unquantized16( out uint3 palette, int3 low, int3 high, int i );
float3 half2float(uint3 color_h );
void block_package( inout uint4 block, int2x3 endPoint[2], uint mode_type, uint partition_index );
void block_package( inout uint4 block, int2x3 endPoint, uint mode_type );
void swap(inout int3 lhs, inout int3 rhs)
{
int3 tmp = lhs;
lhs = rhs;
rhs = tmp;
}
Texture2D<float4> g_Input : register( t0 );
StructuredBuffer<uint4> g_InBuff : register( t1 );
RWStructuredBuffer<uint4> g_OutBuff : register( u0 );
struct SharedData
{
float3 pixel;
int3 pixel_ph;
float3 pixel_hr;
float pixel_lum;
float error;
uint best_mode;
uint best_partition;
int3 endPoint_low;
int3 endPoint_high;
float endPoint_lum_low;
float endPoint_lum_high;
};
groupshared SharedData shared_temp[THREAD_GROUP_SIZE];
[numthreads( THREAD_GROUP_SIZE, 1, 1 )]
void TryModeG10CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID )
{
const uint MAX_USED_THREAD = 16;
uint BLOCK_IN_GROUP = THREAD_GROUP_SIZE / MAX_USED_THREAD;
uint blockInGroup = GI / MAX_USED_THREAD;
uint blockID = g_start_block_id + groupID.x * BLOCK_IN_GROUP + blockInGroup;
uint threadBase = blockInGroup * MAX_USED_THREAD;
uint threadInBlock = GI - threadBase;
#ifndef REF_DEVICE
if (blockID >= g_num_total_blocks)
{
return;
}
#endif
uint block_y = blockID / g_num_block_x;
uint block_x = blockID - block_y * g_num_block_x;
uint base_x = block_x * BLOCK_SIZE_X;
uint base_y = block_y * BLOCK_SIZE_Y;
if (threadInBlock < 16)
{
shared_temp[GI].pixel = g_Input.Load( uint3( base_x + threadInBlock % 4, base_y + threadInBlock / 4, 0 ) ).rgb;
uint3 pixel_h = float2half( shared_temp[GI].pixel );
shared_temp[GI].pixel_hr = half2float(pixel_h);
shared_temp[GI].pixel_lum = dot(shared_temp[GI].pixel_hr, RGB2LUM);
shared_temp[GI].pixel_ph = start_quantize( pixel_h );
shared_temp[GI].endPoint_low = shared_temp[GI].pixel_ph;
shared_temp[GI].endPoint_high = shared_temp[GI].pixel_ph;
shared_temp[GI].endPoint_lum_low = shared_temp[GI].pixel_lum;
shared_temp[GI].endPoint_lum_high = shared_temp[GI].pixel_lum;
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 8)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 8].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 8].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 8].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 8].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 8].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 8].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 4)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 4].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 4].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 4].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 4].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 4].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 4].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 2].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 2].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 2].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 2].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 2].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 2].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 1)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 1].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 1].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 1].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 1].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 1].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 1].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
//ergod mode_type 11:14
if ( threadInBlock == 0 )
{
int2x3 endPoint;
// find_axis
endPoint[0] = shared_temp[threadBase + 0].endPoint_low;
endPoint[1] = shared_temp[threadBase + 0].endPoint_high;
//compute_index
float3 span = endPoint[1] - endPoint[0];// fixed a bug in v0.2
float span_norm_sqr = dot( span, span );// fixed a bug in v0.2
float dotProduct = dot( span, shared_temp[threadBase + 0].pixel_ph - endPoint[0] );// fixed a bug in v0.2
if ( span_norm_sqr > 0 && dotProduct >= 0 && uint( dotProduct * 63.49999 / span_norm_sqr ) > 32 )
{
swap(endPoint[0], endPoint[1]);
shared_temp[GI].endPoint_low = endPoint[0];
shared_temp[GI].endPoint_high = endPoint[1];
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 4)
{
int2x3 endPoint;
endPoint[0] = shared_temp[threadBase + 0].endPoint_low;
endPoint[1] = shared_temp[threadBase + 0].endPoint_high;
float3 span = endPoint[1] - endPoint[0];
float span_norm_sqr = dot( span, span );
uint4 prec = candidateModePrec[threadInBlock + 10];
int2x3 endPoint_q = endPoint;
quantize( endPoint_q, prec.x );
bool transformed = candidateModeTransformed[threadInBlock + 10];
if (transformed)
{
endPoint_q[1] -= endPoint_q[0];
}
bool bBadQuantize;
finish_quantize( bBadQuantize, endPoint_q, prec, transformed );
start_unquantize( endPoint_q, prec, transformed );
unquantize( endPoint_q, prec.x );
float error = 0;
[loop]for ( uint j = 0; j < 16; j ++ )
{
float dotProduct = dot( span, shared_temp[threadBase + j].pixel_ph - endPoint[0] );// fixed a bug in v0.2
uint index = ( span_norm_sqr <= 0 || dotProduct <= 0 ) ? 0
: ( ( dotProduct < span_norm_sqr ) ? aStep2[ uint( dotProduct * 63.49999 / span_norm_sqr ) ] : aStep2[63] );
uint3 pixel_rh;
generate_palette_unquantized16( pixel_rh, endPoint_q[0], endPoint_q[1], index );
float3 pixel_r = half2float( pixel_rh );
pixel_r -= shared_temp[threadBase + j].pixel_hr;
error += dot(pixel_r, pixel_r);
}
if ( bBadQuantize )
error = 1e20f;
shared_temp[GI].error = error;
shared_temp[GI].best_mode = candidateModeFlag[threadInBlock + 10];
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
if ( shared_temp[GI].error > shared_temp[GI + 2].error )
{
shared_temp[GI].error = shared_temp[GI + 2].error;
shared_temp[GI].best_mode = shared_temp[GI + 2].best_mode;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 1)
{
if ( shared_temp[GI].error > shared_temp[GI + 1].error )
{
shared_temp[GI].error = shared_temp[GI + 1].error;
shared_temp[GI].best_mode = shared_temp[GI + 1].best_mode;
}
g_OutBuff[blockID] = uint4(asuint(shared_temp[GI].error), shared_temp[GI].best_mode, 0, 0);
}
}
[numthreads( THREAD_GROUP_SIZE, 1, 1 )]
void TryModeLE10CS( uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID )
{
const uint MAX_USED_THREAD = 32;
uint BLOCK_IN_GROUP = THREAD_GROUP_SIZE / MAX_USED_THREAD;
uint blockInGroup = GI / MAX_USED_THREAD;
uint blockID = g_start_block_id + groupID.x * BLOCK_IN_GROUP + blockInGroup;
uint threadBase = blockInGroup * MAX_USED_THREAD;
uint threadInBlock = GI - threadBase;
#ifndef REF_DEVICE
if (blockID >= g_num_total_blocks)
{
return;
}
if (asfloat(g_InBuff[blockID].x) < 1e-6f)
{
g_OutBuff[blockID] = g_InBuff[blockID];
return;
}
#endif
uint block_y = blockID / g_num_block_x;
uint block_x = blockID - block_y * g_num_block_x;
uint base_x = block_x * BLOCK_SIZE_X;
uint base_y = block_y * BLOCK_SIZE_Y;
if (threadInBlock < 16)
{
shared_temp[GI].pixel = g_Input.Load( uint3( base_x + threadInBlock % 4, base_y + threadInBlock / 4, 0 ) ).rgb;
uint3 pixel_h = float2half( shared_temp[GI].pixel );
shared_temp[GI].pixel_hr = half2float(pixel_h);
shared_temp[GI].pixel_lum = dot(shared_temp[GI].pixel_hr, RGB2LUM);
shared_temp[GI].pixel_ph = start_quantize( pixel_h );
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
//ergod mode_type 1:10
if (threadInBlock < 32)
{
// find_axis
int2x3 endPoint[2];
endPoint[0][0] = MAX_INT;
endPoint[0][1] = MIN_INT;
endPoint[1][0] = MAX_INT;
endPoint[1][1] = MIN_INT;
float2 endPoint_lum[2];
endPoint_lum[0][0] = MAX_FLOAT;
endPoint_lum[0][1] = MIN_FLOAT;
endPoint_lum[1][0] = MAX_FLOAT;
endPoint_lum[1][1] = MIN_FLOAT;
uint bit = candidateSectionBit[threadInBlock];
for ( uint i = 0; i < 16; i ++ )
{
int3 pixel_ph = shared_temp[threadBase + i].pixel_ph;
float pixel_lum = shared_temp[threadBase + i].pixel_lum;
if ( (bit >> i) & 1 ) //It gets error when using "candidateSection" as "endPoint_ph" index
{
if (endPoint_lum[1][0] > pixel_lum)
{
endPoint[1][0] = pixel_ph;
endPoint_lum[1][0] = pixel_lum;
}
if (endPoint_lum[1][1] < pixel_lum)
{
endPoint[1][1] = pixel_ph;
endPoint_lum[1][1] = pixel_lum;
}
}
else
{
if (endPoint_lum[0][0] > pixel_lum)
{
endPoint[0][0] = pixel_ph;
endPoint_lum[0][0] = pixel_lum;
}
if (endPoint_lum[0][1] < pixel_lum)
{
endPoint[0][1] = pixel_ph;
endPoint_lum[0][1] = pixel_lum;
}
}
}
//compute_index
float3 span[2];// fixed a bug in v0.2
float span_norm_sqr[2];// fixed a bug in v0.2
[unroll]
for (uint p = 0; p < 2; ++ p)
{
span[p] = endPoint[p][1] - endPoint[p][0];
span_norm_sqr[p] = dot( span[p], span[p] );
float dotProduct = dot( span[p], shared_temp[threadBase + (0 == p ? 0 : candidateFixUpIndex1D[threadInBlock])].pixel_ph - endPoint[p][0] );// fixed a bug in v0.2
if ( span_norm_sqr[p] > 0 && dotProduct >= 0 && uint( dotProduct * 63.49999 / span_norm_sqr[p] ) > 32 )
{
span[p] = -span[p];
swap(endPoint[p][0], endPoint[p][1]);
}
}
uint4 prec = candidateModePrec[g_mode_id];
int2x3 endPoint_q[2] = endPoint;
quantize( endPoint_q[0], prec.x );
quantize( endPoint_q[1], prec.x );
bool transformed = candidateModeTransformed[g_mode_id];
if (transformed)
{
endPoint_q[0][1] -= endPoint_q[0][0];
endPoint_q[1][0] -= endPoint_q[0][0];
endPoint_q[1][1] -= endPoint_q[0][0];
}
int bBadQuantize = 0;
finish_quantize_0( bBadQuantize, endPoint_q[0], prec, transformed );
finish_quantize_1( bBadQuantize, endPoint_q[1], prec, transformed );
start_unquantize( endPoint_q, prec, transformed );
unquantize( endPoint_q[0], prec.x );
unquantize( endPoint_q[1], prec.x );
float error = 0;
for ( uint j = 0; j < 16; j ++ )
{
uint3 pixel_rh;
if ((bit >> j) & 1)
{
float dotProduct = dot( span[1], shared_temp[threadBase + j].pixel_ph - endPoint[1][0] );// fixed a bug in v0.2
uint index = ( span_norm_sqr[1] <= 0 || dotProduct <= 0 ) ? 0
: ( ( dotProduct < span_norm_sqr[1] ) ? aStep1[ uint( dotProduct * 63.49999 / span_norm_sqr[1] ) ] : aStep1[63] );
generate_palette_unquantized8( pixel_rh, endPoint_q[1][0], endPoint_q[1][1], index );
}
else
{
float dotProduct = dot( span[0], shared_temp[threadBase + j].pixel_ph - endPoint[0][0] );// fixed a bug in v0.2
uint index = ( span_norm_sqr[0] <= 0 || dotProduct <= 0 ) ? 0
: ( ( dotProduct < span_norm_sqr[0] ) ? aStep1[ uint( dotProduct * 63.49999 / span_norm_sqr[0] ) ] : aStep1[63] );
generate_palette_unquantized8( pixel_rh, endPoint_q[0][0], endPoint_q[0][1], index );
}
float3 pixel_r = half2float( pixel_rh );
pixel_r -= shared_temp[threadBase + j].pixel_hr;
error += dot(pixel_r, pixel_r);
}
if ( bBadQuantize )
error = 1e20f;
shared_temp[GI].error = error;
shared_temp[GI].best_mode = candidateModeFlag[g_mode_id];
shared_temp[GI].best_partition = threadInBlock;
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 16)
{
if ( shared_temp[GI].error > shared_temp[GI + 16].error )
{
shared_temp[GI].error = shared_temp[GI + 16].error;
shared_temp[GI].best_mode = shared_temp[GI + 16].best_mode;
shared_temp[GI].best_partition = shared_temp[GI + 16].best_partition;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 8)
{
if ( shared_temp[GI].error > shared_temp[GI + 8].error )
{
shared_temp[GI].error = shared_temp[GI + 8].error;
shared_temp[GI].best_mode = shared_temp[GI + 8].best_mode;
shared_temp[GI].best_partition = shared_temp[GI + 8].best_partition;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 4)
{
if ( shared_temp[GI].error > shared_temp[GI + 4].error )
{
shared_temp[GI].error = shared_temp[GI + 4].error;
shared_temp[GI].best_mode = shared_temp[GI + 4].best_mode;
shared_temp[GI].best_partition = shared_temp[GI + 4].best_partition;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
if ( shared_temp[GI].error > shared_temp[GI + 2].error )
{
shared_temp[GI].error = shared_temp[GI + 2].error;
shared_temp[GI].best_mode = shared_temp[GI + 2].best_mode;
shared_temp[GI].best_partition = shared_temp[GI + 2].best_partition;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 1)
{
if ( shared_temp[GI].error > shared_temp[GI + 1].error )
{
shared_temp[GI].error = shared_temp[GI + 1].error;
shared_temp[GI].best_mode = shared_temp[GI + 1].best_mode;
shared_temp[GI].best_partition = shared_temp[GI + 1].best_partition;
}
if (asfloat(g_InBuff[blockID].x) > shared_temp[GI].error)
{
g_OutBuff[blockID] = uint4(asuint(shared_temp[GI].error), shared_temp[GI].best_mode, shared_temp[GI].best_partition, 0);
}
else
{
g_OutBuff[blockID] = g_InBuff[blockID];
}
}
}
[numthreads( THREAD_GROUP_SIZE, 1, 1 )]
void EncodeBlockCS(uint GI : SV_GroupIndex, uint3 groupID : SV_GroupID)
{
const uint MAX_USED_THREAD = 32;
uint BLOCK_IN_GROUP = THREAD_GROUP_SIZE / MAX_USED_THREAD;
uint blockInGroup = GI / MAX_USED_THREAD;
uint blockID = g_start_block_id + groupID.x * BLOCK_IN_GROUP + blockInGroup;
uint threadBase = blockInGroup * MAX_USED_THREAD;
uint threadInBlock = GI - threadBase;
#ifndef REF_DEVICE
if (blockID >= g_num_total_blocks)
{
return;
}
#endif
uint block_y = blockID / g_num_block_x;
uint block_x = blockID - block_y * g_num_block_x;
uint base_x = block_x * BLOCK_SIZE_X;
uint base_y = block_y * BLOCK_SIZE_Y;
if (threadInBlock < 16)
{
shared_temp[GI].pixel = g_Input.Load( uint3( base_x + threadInBlock % 4, base_y + threadInBlock / 4, 0 ) ).rgb;
shared_temp[GI].pixel_lum = dot(shared_temp[GI].pixel, RGB2LUM);
uint3 pixel_h = float2half( shared_temp[GI].pixel );
shared_temp[GI].pixel_ph = start_quantize( pixel_h );
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
uint best_mode = g_InBuff[blockID].y;
uint best_partition = g_InBuff[blockID].z;
uint4 block = 0;
if (threadInBlock < 32)
{
int2x3 endPoint;
endPoint[0] = MAX_INT;
endPoint[1] = MIN_INT;
float2 endPoint_lum;
endPoint_lum[0] = MAX_FLOAT;
endPoint_lum[1] = MIN_FLOAT;
int2 endPoint_lum_index;
endPoint_lum_index[0] = -1;
endPoint_lum_index[1] = -1;
int3 pixel_ph = shared_temp[threadBase + (threadInBlock & 0xF)].pixel_ph;
float pixel_lum = shared_temp[threadBase + (threadInBlock & 0xF)].pixel_lum;
if (threadInBlock < 16)
{
if (best_mode > 10)
{
endPoint[0] = endPoint[1] = pixel_ph;
endPoint_lum[0] = endPoint_lum[1] = pixel_lum;
}
else
{
uint bits = candidateSectionBit[best_partition];
if (0 == ((bits >> threadInBlock) & 1))
{
endPoint[0] = endPoint[1] = pixel_ph;
endPoint_lum[0] = endPoint_lum[1] = pixel_lum;
}
}
}
else
{
if (best_mode <= 10)
{
uint bits = candidateSectionBit[best_partition];
if (1 == ((bits >> (threadInBlock & 0xF)) & 1))
{
endPoint[0] = endPoint[1] = pixel_ph;
endPoint_lum[0] = endPoint_lum[1] = pixel_lum;
}
}
}
shared_temp[GI].endPoint_low = endPoint[0];
shared_temp[GI].endPoint_high = endPoint[1];
shared_temp[GI].endPoint_lum_low = endPoint_lum[0];
shared_temp[GI].endPoint_lum_high = endPoint_lum[1];
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if ((threadInBlock & 0xF) < 8)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 8].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 8].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 8].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 8].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 8].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 8].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if ((threadInBlock & 0xF) < 4)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 4].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 4].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 4].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 4].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 4].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 4].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if ((threadInBlock & 0xF) < 2)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 2].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 2].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 2].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 2].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 2].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 2].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if ((threadInBlock & 0xF) < 1)
{
if (shared_temp[GI].endPoint_lum_low > shared_temp[GI + 1].endPoint_lum_low)
{
shared_temp[GI].endPoint_low = shared_temp[GI + 1].endPoint_low;
shared_temp[GI].endPoint_lum_low = shared_temp[GI + 1].endPoint_lum_low;
}
if (shared_temp[GI].endPoint_lum_high < shared_temp[GI + 1].endPoint_lum_high)
{
shared_temp[GI].endPoint_high = shared_temp[GI + 1].endPoint_high;
shared_temp[GI].endPoint_lum_high = shared_temp[GI + 1].endPoint_lum_high;
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
// find_axis
int2x3 endPoint;
endPoint[0] = shared_temp[threadBase + threadInBlock * 16].endPoint_low;
endPoint[1] = shared_temp[threadBase + threadInBlock * 16].endPoint_high;
uint fixup = 0;
if ((1 == threadInBlock) && (best_mode <= 10))
{
fixup = candidateFixUpIndex1D[best_partition];
}
float3 span = endPoint[1] - endPoint[0];
float span_norm_sqr = dot( span, span );
float dotProduct = dot( span, shared_temp[threadBase + fixup].pixel_ph - endPoint[0] );
if ( span_norm_sqr > 0 && dotProduct >= 0 && uint( dotProduct * 63.49999 / span_norm_sqr ) > 32 )
{
swap(endPoint[0], endPoint[1]);
}
shared_temp[GI].endPoint_low = endPoint[0];
shared_temp[GI].endPoint_high = endPoint[1];
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 16)
{
uint bits;
if (best_mode > 10)
{
bits = 0;
}
else
{
bits = candidateSectionBit[best_partition];
}
float3 span;
float dotProduct;
if ((bits >> threadInBlock) & 1)
{
span = shared_temp[threadBase + 1].endPoint_high - shared_temp[threadBase + 1].endPoint_low;
dotProduct = dot( span, shared_temp[threadBase + threadInBlock].pixel_ph - shared_temp[threadBase + 1].endPoint_low );
}
else
{
span = shared_temp[threadBase + 0].endPoint_high - shared_temp[threadBase + 0].endPoint_low;
dotProduct = dot( span, shared_temp[threadBase + threadInBlock].pixel_ph - shared_temp[threadBase + 0].endPoint_low );
}
float span_norm_sqr = dot( span, span );
if (best_mode > 10)
{
uint index = ( span_norm_sqr <= 0 || dotProduct <= 0 ) ? 0
: ( ( dotProduct < span_norm_sqr ) ? aStep2[ uint( dotProduct * 63.49999 / span_norm_sqr ) ] : aStep2[63] );
if (threadInBlock == 0)
{
block.z |= index << 1;
}
else if (threadInBlock < 8)
{
block.z |= index << (threadInBlock * 4);
}
else
{
block.w |= index << ((threadInBlock - 8) * 4);
}
}
else
{
uint index = ( span_norm_sqr <= 0 || dotProduct <= 0 ) ? 0
: ( ( dotProduct < span_norm_sqr ) ? aStep1[ uint( dotProduct * 63.49999 / span_norm_sqr ) ] : aStep1[63] );
uint fixup = candidateFixUpIndex1D[best_partition];
int2 offset = int2((fixup != 2), (fixup == 15));
if (threadInBlock == 0)
{
block.z |= index << 18;
}
else if (threadInBlock < 3)
{
block.z |= index << (20 + (threadInBlock - 1) * 3);
}
else if (threadInBlock < 5)
{
block.z |= index << (25 + (threadInBlock - 3) * 3 + offset.x);
}
else if (threadInBlock == 5)
{
block.w |= index >> !offset.x;
if (!offset.x)
{
block.z |= index << 31;
}
}
else if (threadInBlock < 9)
{
block.w |= index << (2 + (threadInBlock - 6) * 3 + offset.x);
}
else
{
block.w |= index << (11 + (threadInBlock - 9) * 3 + offset.y);
}
}
shared_temp[GI].pixel_hr.xy = asfloat(block.zw);
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 8)
{
shared_temp[GI].pixel_hr.xy = asfloat(asuint(shared_temp[GI].pixel_hr.xy) | asuint(shared_temp[GI + 8].pixel_hr.xy));
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 4)
{
shared_temp[GI].pixel_hr.xy = asfloat(asuint(shared_temp[GI].pixel_hr.xy) | asuint(shared_temp[GI + 4].pixel_hr.xy));
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
shared_temp[GI].pixel_hr.xy = asfloat(asuint(shared_temp[GI].pixel_hr.xy) | asuint(shared_temp[GI + 2].pixel_hr.xy));
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 1)
{
shared_temp[GI].pixel_hr.xy = asfloat(asuint(shared_temp[GI].pixel_hr.xy) | asuint(shared_temp[GI + 1].pixel_hr.xy));
block.zw = asuint(shared_temp[GI].pixel_hr.xy);
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
bool transformed = candidateModeTransformed[best_mode - 1];
uint4 prec = candidateModePrec[best_mode - 1];
if (threadInBlock == 2)
{
int2x3 endPoint_q;
endPoint_q[0] = shared_temp[threadBase + 0].endPoint_low;
endPoint_q[1] = shared_temp[threadBase + 0].endPoint_high;
quantize( endPoint_q, prec.x );
if (transformed)
{
endPoint_q[1] -= endPoint_q[0];
}
shared_temp[GI].endPoint_low = endPoint_q[0];
shared_temp[GI].endPoint_high = endPoint_q[1];
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock == 3)
{
int3 ep0 = shared_temp[threadBase + 2].endPoint_low;
int2x3 endPoint_q;
endPoint_q[0] = shared_temp[threadBase + 1].endPoint_low;
endPoint_q[1] = shared_temp[threadBase + 1].endPoint_high;
if (best_mode <= 10)
{
quantize( endPoint_q, prec.x );
if (transformed)
{
endPoint_q[0] -= ep0;
endPoint_q[1] -= ep0;
}
shared_temp[GI].endPoint_low = endPoint_q[0];
shared_temp[GI].endPoint_high = endPoint_q[1];
}
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if (threadInBlock < 2)
{
int2x3 endPoint_q;
endPoint_q[0] = shared_temp[threadBase + threadInBlock + 2].endPoint_low;
endPoint_q[1] = shared_temp[threadBase + threadInBlock + 2].endPoint_high;
int bBadQuantize = 0;
if (threadInBlock == 0)
{
if (best_mode > 10)
{
finish_quantize( bBadQuantize, endPoint_q, prec, transformed );
}
else
{
finish_quantize_0( bBadQuantize, endPoint_q, prec, transformed );
}
}
else // if (threadInBlock == 1)
{
if (best_mode <= 10)
{
finish_quantize_1( bBadQuantize, endPoint_q, prec, transformed );
}
}
shared_temp[GI].endPoint_low = endPoint_q[0];
shared_temp[GI].endPoint_high = endPoint_q[1];
}
#ifdef REF_DEVICE
GroupMemoryBarrierWithGroupSync();
#endif
if ( threadInBlock == 0 )
{
int2x3 endPoint_q[2];
endPoint_q[0][0] = shared_temp[threadBase + 0].endPoint_low;
endPoint_q[0][1] = shared_temp[threadBase + 0].endPoint_high;
endPoint_q[1][0] = shared_temp[threadBase + 1].endPoint_low;
endPoint_q[1][1] = shared_temp[threadBase + 1].endPoint_high;
if ( best_mode > 10 )
{
block_package( block, endPoint_q[0], best_mode );
}
else
{
block_package( block, endPoint_q, best_mode, best_partition );
}
g_OutBuff[blockID] = block;
}
}
uint float2half1( float f )
{
uint Result;
uint IValue = asuint(f);
uint Sign = (IValue & 0x80000000U) >> 16U;
IValue = IValue & 0x7FFFFFFFU;
if (IValue > 0x47FFEFFFU)
{
// The number is too large to be represented as a half. Saturate to infinity.
Result = 0x7FFFU;
}
else
{
if (IValue < 0x38800000U)
{
// The number is too small to be represented as a normalized half.
// Convert it to a denormalized value.
uint Shift = 113U - (IValue >> 23U);
IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift;
}
else
{
// Rebias the exponent to represent the value as a normalized half.
IValue += 0xC8000000U;
}
Result = ((IValue + 0x0FFFU + ((IValue >> 13U) & 1U)) >> 13U)&0x7FFFU;
}
return (Result|Sign);
}
uint3 float2half( float3 endPoint_f )
{
//uint3 sign = asuint(endPoint_f) & 0x80000000;
//uint3 expo = asuint(endPoint_f) & 0x7F800000;
//uint3 base = asuint(endPoint_f) & 0x007FFFFF;
//return ( expo < 0x33800000 ) ? 0
// //0x33800000 indicating 2^-24, which is minimal denormalized number that half can present
// : ( ( expo < 0x38800000 ) ? ( sign >> 16 ) | ( ( base + 0x00800000 ) >> ( 23 - ( ( expo - 0x33800000 ) >> 23 ) ) )//fixed a bug in v0.2
// //0x38800000 indicating 2^-14, which is minimal normalized number that half can present, so need to use denormalized half presentation
// : ( ( expo == 0x7F800000 || expo > 0x47000000 ) ? ( ( sign >> 16 ) | 0x7bff )
// // treat NaN as INF, treat INF (including NaN) as the maximum/minimum number that half can present
// // 0x47000000 indicating 2^15, which is maximum exponent that half can present, so cut to 0x7bff which is the maximum half number
// : ( ( sign >> 16 ) | ( ( ( expo - 0x38000000 ) | base ) >> 13 ) ) ) );
return uint3( float2half1( endPoint_f.x ), float2half1( endPoint_f.y ), float2half1( endPoint_f.z ) );
}
int3 start_quantize( uint3 pixel_h )
{
if ( g_format == UNSIGNED_F16 )
{
return asint( ( pixel_h << 6 ) / 31 );
}
else
{
return ( pixel_h < 0x8000 ) ? ( ( pixel_h == 0x7bff ) ? 0x7fff : asint( ( pixel_h << 5 ) / 31 ) )// fixed a bug in v0.2
: ( ( pixel_h == 0x7bff ) ? 0xffff8001 : -asint( ( ( 0x00007fff & pixel_h ) << 5 ) / 31 ) );// fixed a bug in v0.2
}
}
void quantize( inout int2x3 endPoint, uint prec )
{
int iprec = asint( prec );
if ( g_format == UNSIGNED_F16 )
{
endPoint = ( ( iprec >= 15 ) | ( endPoint == 0 ) ) ? endPoint
: ( ( endPoint == asint(0xFFFF) ) ? ( ( 1 << iprec ) - 1 )
: ( ( ( endPoint << iprec ) + asint(0x0000) ) >> 16 ) );
}
else
{
endPoint = ( ( iprec >= 16 ) | ( endPoint == 0 ) ) ? endPoint
: ( ( endPoint >= 0 ) ? ( ( endPoint == asint(0x7FFF) ) ? ( ( 1 << ( iprec - 1 ) ) - 1 ) : ( ( ( endPoint << ( iprec - 1 ) ) + asint(0x0000) ) >> 15 ) )
: ( ( -endPoint == asint(0x7FFF) ) ? -( ( 1 << ( iprec - 1 ) ) - 1 ) : -( ( ( -endPoint << ( iprec - 1 ) ) + asint(0x0000) ) >> 15 ) ) );
}
}
void finish_quantize_0( inout int bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed )
{
if ( transformed )
{
bool3 bBadComponent = ( endPoint[1] >= 0 ) ? ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) )
: ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) );
bBadQuantize |= any(bBadComponent);
endPoint[0] = endPoint[0] & ( ( 1 << prec.x ) - 1 );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[1] & ( ( 1 << prec.yzw ) - 1 ) ) );
}
else
{
endPoint &= ( ( 1 << prec.x ) - 1 );
}
}
void finish_quantize_1( inout int bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed )
{
if ( transformed )
{
bool2x3 bBadComponent;
bBadComponent[0] = ( endPoint[0] >= 0 ) ? ( endPoint[0] >= ( 1 << ( prec.yzw - 1 ) ) )
: ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) );
bBadComponent[1] = ( endPoint[1] >= 0 ) ? ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) )
: ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) );
bBadQuantize |= any(bBadComponent);
endPoint[0] = ( endPoint[0] >= 0 ) ? ( ( endPoint[0] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[0] )
: ( ( -endPoint[0] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[0] & ( ( 1 << prec.yzw ) - 1 ) ) );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[1] & ( ( 1 << prec.yzw ) - 1 ) ) );
}
else
{
endPoint &= ( ( 1 << prec.x ) - 1 );
}
}
void finish_quantize( out bool bBadQuantize, inout int2x3 endPoint, uint4 prec, bool transformed )
{
if ( transformed )
{
bool3 bBadComponent;
bBadComponent = ( endPoint[1] >= 0 ) ? ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) )
: ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) );
bBadQuantize = any( bBadComponent );
endPoint[0] = endPoint[0] & ( ( 1 << prec.x ) - 1 );
endPoint[1] = ( endPoint[1] >= 0 ) ? ( ( endPoint[1] >= ( 1 << ( prec.yzw - 1 ) ) ) ? ( ( 1 << ( prec.yzw - 1 ) ) - 1 ) : endPoint[1] )
: ( ( -endPoint[1] > ( 1 << ( prec.yzw - 1 ) ) ) ? ( 1 << ( prec.yzw - 1 ) ) : ( endPoint[1] & ( ( 1 << prec.yzw ) - 1 ) ) );
}
else
{
endPoint &= ( ( 1 << prec.x ) - 1 );
bBadQuantize = 0;
}
}
void SIGN_EXTEND( uint3 prec, inout int3 color )
{
uint3 p = 1 << (prec - 1);
color = (color & p) ? (color & (p - 1)) - p : color;
}
void sign_extend( bool transformed, uint4 prec, inout int2x3 endPoint )
{
if ( g_format == SIGNED_F16 )
SIGN_EXTEND( prec.x, endPoint[0] );
if ( g_format == SIGNED_F16 || transformed )
SIGN_EXTEND( prec.yzw, endPoint[1] );
}
void sign_extend( bool transformed, uint4 prec, inout int2x3 endPoint[2] )
{
if ( g_format == SIGNED_F16 )
SIGN_EXTEND( prec.x, endPoint[0][0] );
if ( g_format == SIGNED_F16 || transformed )
{
SIGN_EXTEND( prec.yzw, endPoint[0][1] );
SIGN_EXTEND( prec.yzw, endPoint[1][0] );
SIGN_EXTEND( prec.yzw, endPoint[1][1] );
}
}
void start_unquantize( inout int2x3 endPoint[2], uint4 prec, bool transformed )
{
sign_extend( transformed, prec, endPoint );
if ( transformed )
{
endPoint[0][1] += endPoint[0][0];
endPoint[1][0] += endPoint[0][0];
endPoint[1][1] += endPoint[0][0];
}
}
void start_unquantize( inout int2x3 endPoint, uint4 prec, bool transformed )
{
sign_extend( transformed, prec, endPoint );
if ( transformed )
endPoint[1] += endPoint[0];
}
void unquantize( inout int2x3 color, uint prec )
{
int iprec = asint( prec );
if (g_format == UNSIGNED_F16 )
{
if (prec < 15)
{
color = (color != 0) ? (color == ((1 << iprec) - 1) ? 0xFFFF : (((color << 16) + 0x8000) >> iprec)) : color;
}
}
else
{
if (prec < 16)
{
uint2x3 s = color >= 0 ? 0 : 1;
color = abs(color);
color = (color != 0) ? (color >= ((1 << (iprec - 1)) - 1) ? 0x7FFF : (((color << 15) + 0x4000) >> (iprec - 1))) : color;
color = s > 0 ? -color : color;
}
}
}
uint3 finish_unquantize( int3 color )
{
if ( g_format == UNSIGNED_F16 )
color = ( color * 31 ) >> 6;
else
{
color = ( color < 0 ) ? -( ( -color * 31 ) >> 5 ) : ( color * 31 ) >> 5;
color = ( color < 0 ) ? ( ( -color ) | 0x8000 ) : color;
}
return asuint(color);
}
void generate_palette_unquantized8( out uint3 palette, int3 low, int3 high, int i )
{
static const int aWeight3[] = {0, 9, 18, 27, 37, 46, 55, 64};
int3 tmp = ( low * ( 64 - aWeight3[i] ) + high * aWeight3[i] + 32 ) >> 6;
palette = finish_unquantize( tmp );
}
void generate_palette_unquantized16( out uint3 palette, int3 low, int3 high, int i )
{
static const int aWeight4[] = {0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64};
int3 tmp = ( low * ( 64 - aWeight4[i] ) + high * aWeight4[i] + 32 ) >> 6;
palette = finish_unquantize( tmp );
}
float half2float1( uint Value )
{
uint Mantissa = (uint)(Value & 0x03FF);
uint Exponent;
if ((Value & 0x7C00) != 0) // The value is normalized
{
Exponent = (uint)((Value >> 10) & 0x1F);
}
else if (Mantissa != 0) // The value is denormalized
{
// Normalize the value in the resulting float
Exponent = 1;
do
{
Exponent--;
Mantissa <<= 1;
} while ((Mantissa & 0x0400) == 0);
Mantissa &= 0x03FF;
}
else // The value is zero
{
Exponent = (uint)(-112);
}
uint Result = ((Value & 0x8000) << 16) | // Sign
((Exponent + 112) << 23) | // Exponent
(Mantissa << 13); // Mantissa
return asfloat(Result);
}
float3 half2float(uint3 color_h )
{
//uint3 sign = color_h & 0x8000;
//uint3 expo = color_h & 0x7C00;
//uint3 base = color_h & 0x03FF;
//return ( expo == 0 ) ? asfloat( ( sign << 16 ) | asuint( float3(base) / 16777216 ) ) //16777216 = 2^24
// : asfloat( ( sign << 16 ) | ( ( ( expo + 0x1C000 ) | base ) << 13 ) ); //0x1C000 = 0x1FC00 - 0x3C00
return float3( half2float1( color_h.x ), half2float1( color_h.y ), half2float1( color_h.z ) );
}
void block_package( inout uint4 block, int2x3 endPoint[2], uint mode_type, uint partition_index ) // for mode 1 - 10
{
block.xy = 0;
block.z &= 0xFFFC0000;
//block.z |= (partition_index & 0x1f) << 13;
if ( mode_type == candidateModeFlag[0])
{
/*block.x = candidateModeMemory[0];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00007FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x01FF8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.x |= ( endPoint[1][0].g >> 2 ) & 0x00000004;
block.x |= ( endPoint[1][0].b >> 1 ) & 0x00000008;
block.x |= endPoint[1][1].b & 0x00000010;
block.y |= ( ( endPoint[0][0].b >> 7 ) & 0x00000007 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000000F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0003E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x0F800000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000003E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].g << 4 ) & 0x00000100 );
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000F80);
block.yz |= ( ( endPoint[1][1].b << uint2(27, 9) ) & uint2(0x10000000, 0x00001000) ) | ( ( endPoint[1][1].b << uint2(18, 4) ) & uint2(0x00040000, 0x00000040) );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[0] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[0] >> 1) & 1) << 1;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 2;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 3;
block.x |= ((endPoint[1][1].b >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0][0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0][0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0][0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0][0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0][0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0][0].b >> 9) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1][1].g >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[1])
{
/*block.x = candidateModeMemory[1];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00000FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x003F8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000001F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0007E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x1F800000 );
block.x |= ( ( endPoint[1][0].g >> 3 ) & 0x00000004 ) | ( ( endPoint[1][0].g << 20 ) & 0x01000000 );
block.x |= ( endPoint[1][1].g >> 1 ) & 0x00000018;
block.x |= ( ( endPoint[1][1].b << 21 ) & 0x00800000 ) | ( ( endPoint[1][1].b << 12 ) & 0x00003000 );
block.x |= ( ( endPoint[1][0].b << 17 ) & 0x00400000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000007E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00001F80);
block.y |= ( ( endPoint[1][1].b >> 4 ) & 0x00000002 ) | ( ( endPoint[1][1].b >> 2 ) & 0x00000004 ) | ( ( endPoint[1][1].b >> 3 ) & 0x00000001 );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[1] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[1] >> 1) & 1) << 1;
block.x |= ((endPoint[1][0].g >> 5) & 1) << 2;
block.x |= ((endPoint[1][1].g >> 4) & 1) << 3;
block.x |= ((endPoint[1][1].g >> 5) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[1][1].b >> 0) & 1) << 12;
block.x |= ((endPoint[1][1].b >> 1) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[1][0].b >> 5) & 1) << 22;
block.x |= ((endPoint[1][1].b >> 2) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[1][1].b >> 3) & 1) << 0;
block.y |= ((endPoint[1][1].b >> 5) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[0][1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[0][1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[0][1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][0].r >> 5) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].r >> 5) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[2])
{
/*block.x = candidateModeMemory[2];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00007FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x01FF8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].r >> 2 ) & 0x00000100;
block.y |= ( endPoint[0][0].g << 7 ) & 0x00020000;
block.y |= ( ( endPoint[0][0].b << 17 ) & 0x08000000 ) | ( ( endPoint[0][0].b >> 7 ) & 0x00000007 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000000F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0001E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x07800000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000003E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000F80);
block.yz |= ( ( endPoint[1][1].b << uint2(27, 9) ) & uint2(0x10000000, 0x00001000) ) | ( ( endPoint[1][1].b << uint2(18, 4) ) & uint2(0x00040000, 0x00000040) );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[2] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[2] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[2] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[2] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[2] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0][0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0][0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0][0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0][0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0][0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0][0].b >> 9) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[0][0].r >> 10) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][0].g >> 10) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][0].b >> 10) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[3])
{
/*block.x = candidateModeMemory[3];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00007FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x01FF8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].r >> 3 ) & 0x00000080;
block.y |= ( endPoint[0][0].g << 8 ) & 0x00040000;
block.y |= ( ( endPoint[0][0].b << 17 ) & 0x08000000 ) | ( ( endPoint[0][0].b >> 7 ) & 0x00000007 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x00000078 ) | ( ( endPoint[0][1].g << 13 ) & 0x0003E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x07800000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000001E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].g << 4 ) & 0x00000100 );
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000780);
block.yz |= ( endPoint[1][1].b << uint2(27, 9) ) & uint2(0x10000000, 0x00001000);
block.z |= ( ( endPoint[1][0].g << 7 ) & 0x00000800 );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;
block.z |= ( endPoint[1][1].b << 4 ) & 0x00000040;
block.z |= ( endPoint[1][1].b << 5 ) & 0x00000020;*/
block.x |= ((candidateModeMemory[3] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[3] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[3] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[3] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[3] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0][0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0][0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0][0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0][0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0][0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0][0].b >> 9) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][0].r >> 10) & 1) << 7;
block.y |= ((endPoint[1][1].g >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[0][0].g >> 10) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][0].b >> 10) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][1].b >> 0) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][0].g >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[4])
{
/*block.x = candidateModeMemory[4];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00007FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x01FF8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].r >> 3 ) & 0x00000080;
block.y |= ( endPoint[0][0].g << 7 ) & 0x00020000;
block.y |= ( ( endPoint[0][0].b << 18 ) & 0x10000000 ) | ( ( endPoint[0][0].b >> 7 ) & 0x00000007 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x00000078 ) | ( ( endPoint[0][1].g << 13 ) & 0x0001E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x0F800000 );
block.y |= ( ( endPoint[1][0].g << 9 ) & 0x00001E00 ) | ( ( endPoint[1][0].b << 4 ) & 0x00000100 );
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000780);
block.yz |= ( endPoint[1][1].b << uint2(18, 4) ) & uint2(0x00040000, 0x00000060);
block.z |= ( endPoint[1][0].r << 1 ) & 0x0000001E;
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;
block.z |= ( ( endPoint[1][1].b << 7 ) & 0x00000800 ) | ( ( endPoint[1][1].b << 9 ) & 0x00001000 );*/
block.x |= ((candidateModeMemory[4] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[4] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[4] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[4] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[4] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0][0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0][0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0][0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0][0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0][0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0][0].b >> 9) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][0].r >> 10) & 1) << 7;
block.y |= ((endPoint[1][0].b >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][0].g >> 10) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[0][0].b >> 10) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][1].b >> 1) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].b >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[5])
{
/*block.x = candidateModeMemory[5];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00003FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x00FF8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000);
block.y |= ( endPoint[0][0].b >> 7 ) & 0x00000003;
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000000F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0003E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x0F800000 );
block.x |= ( ( endPoint[1][0].g << 20 ) & 0x01000000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000003E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].g << 4 ) & 0x00000100 ) | ( ( endPoint[1][1].b >> 2 ) & 0x00000004 );
block.y |= ( ( endPoint[1][1].b << 27 ) & 0x10000000 );
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000F80);
block.yz |= ( endPoint[1][1].b << uint2(18, 4) ) & uint2(0x00040000, 0x00000040);
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;
block.z |= ( ( endPoint[1][1].b << 9 ) & 0x00001000 );*/
block.x |= ((candidateModeMemory[5] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[5] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[5] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[5] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[5] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0][0].r >> 8) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0][0].g >> 8) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0][0].b >> 8) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1][1].g >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[6])
{
/*block.x = candidateModeMemory[6];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00001FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x007F8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].b >> 7 ) & 0x00000001;
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000001F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0003E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x0F800000 );
block.x |= ( ( endPoint[1][0].g << 20 ) & 0x01000000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000);
block.x |= ( ( endPoint[1][1].g << 9 ) & 0x00002000 ) | ( ( endPoint[1][1].b << 21 ) & 0x00800000);
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000007E);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00001F80);
block.y |= ( ( endPoint[1][1].b >> 2 ) & 0x00000006 );
block.y |= ( ( endPoint[1][1].b << 27 ) & 0x10000000 ) | ( ( endPoint[1][1].b << 18 ) & 0x00040000 );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[6] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[6] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[6] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[6] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[6] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[1][1].g >> 4) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[1][1].b >> 2) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[1][1].b >> 3) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[0][1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][0].r >> 5) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].r >> 5) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[7])
{
/*block.x = candidateModeMemory[7];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00001FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x007F8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].b >> 7 ) & 0x00000001;
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000000F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0007E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x0F800000 );
block.x |= ( ( endPoint[1][0].g << 20 ) & 0x01000000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000 );
block.x |= ( ( endPoint[1][0].g << 18 ) & 0x00800000 );
block.x |= ( ( endPoint[1][1].b << 13 ) & 0x00002000 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000003E);
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000F80);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].g >> 4 ) & 0x00000002 ) | ( ( endPoint[1][1].g << 4 ) & 0x00000100 ) | ( ( endPoint[1][1].b >> 2 ) & 0x00000004 );
block.y |= ( endPoint[1][1].b << 27 ) & 0x10000000;
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;
block.z |= ( ( endPoint[1][1].b << 9 ) & 0x00001000 ) | ( ( endPoint[1][1].b << 4 ) & 0x00000040 );*/
block.x |= ((candidateModeMemory[7] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[7] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[7] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[7] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[7] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[1][1].b >> 0) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[1][0].g >> 5) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[1][1].g >> 5) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1][1].g >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[0][1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1][1].b >> 1) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[8])
{
/*block.x = candidateModeMemory[8];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x00001FE0 ) | ( ( endPoint[0][0].g << 15 ) & 0x007F8000 ) | ( ( endPoint[0][0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0][0].b >> 7 ) & 0x00000001;
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000000F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0003E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x1F800000 );
block.x |= ( ( endPoint[1][0].g << 20 ) & 0x01000000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000 );
block.x |= ( ( endPoint[1][0].b << 18 ) & 0x00800000 );
block.x |= ( endPoint[1][1].b << 12 ) & 0x00002000;
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].g << 4 ) & 0x00000100 ) | ( ( endPoint[1][1].b >> 4 ) & 0x00000002 ) | ( ( endPoint[1][1].b >> 2 ) & 0x00000004 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000003E);
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00000F80);
block.y |= ( endPoint[1][1].b << 18 ) & 0x00040000;
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;
block.z |= ( ( endPoint[1][1].b << 9 ) & 0x00001000 ) | ( ( endPoint[1][1].b << 4 ) & 0x00000040 );*/
block.x |= ((candidateModeMemory[8] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[8] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[8] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[8] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[8] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0][0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0][0].r >> 7) & 1) << 12;
block.x |= ((endPoint[1][1].b >> 1) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0][0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0][0].g >> 7) & 1) << 22;
block.x |= ((endPoint[1][0].b >> 5) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0][0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0][0].b >> 7) & 1) << 0;
block.y |= ((endPoint[1][1].b >> 5) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1][1].g >> 4) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1][1].b >> 0) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[0][1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][1].b >> 2) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].b >> 3) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
else if ( mode_type == candidateModeFlag[9])
{
/*block.x = candidateModeMemory[9];
block.x |= ( ( endPoint[0][0].r << 5 ) & 0x000007E0 ) | ( ( endPoint[0][0].g << 15 ) & 0x001F8000 ) | ( ( endPoint[0][0].b << 25 ) & 0x7E000000 );
block.y |= ( ( endPoint[0][1].r << 3 ) & 0x000001F8 ) | ( ( endPoint[0][1].g << 13 ) & 0x0007E000 ) | ( ( endPoint[0][1].b << 23 ) & 0x1F800000 );
block.x |= ( ( endPoint[1][0].g << 16 ) & 0x00200000 ) | ( ( endPoint[1][0].g << 20 ) & 0x01000000 );
block.x |= ( ( endPoint[1][0].b << 17 ) & 0x00400000 ) | ( ( endPoint[1][0].b << 10 ) & 0x00004000 );
block.x |= ( ( endPoint[1][1].b << 21 ) & 0x00800000 ) | ( ( endPoint[1][1].b << 12 ) & 0x00003000 );
block.x |= ( ( endPoint[1][1].g << 26 ) & 0x80000000 ) | ( ( endPoint[1][1].g << 7 ) & 0x00000800 );
block.yz |= ( endPoint[1][0].gr << uint2(9, 1) ) & uint2(0x00001E00, 0x0000007E);
block.yz |= ( endPoint[1][1].gr << uint2(19, 7) ) & uint2(0x00780000, 0x00001F80);
block.y |= ( endPoint[1][0].b << 29 ) & 0xE0000000;
block.y |= ( ( endPoint[1][1].b >> 4 ) & 0x00000002 ) | ( ( endPoint[1][1].b >> 2 ) & 0x00000004 ) | ( ( endPoint[1][1].b >> 3 ) & 0x00000001 );
block.z |= ( endPoint[1][0].b >> 3 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[9] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[9] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[9] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[9] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[9] >> 4) & 1) << 4;
block.x |= ((endPoint[0][0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0][0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0][0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0][0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0][0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0][0].r >> 5) & 1) << 10;
block.x |= ((endPoint[1][1].g >> 4) & 1) << 11;
block.x |= ((endPoint[1][1].b >> 0) & 1) << 12;
block.x |= ((endPoint[1][1].b >> 1) & 1) << 13;
block.x |= ((endPoint[1][0].b >> 4) & 1) << 14;
block.x |= ((endPoint[0][0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0][0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0][0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0][0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0][0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0][0].g >> 5) & 1) << 20;
block.x |= ((endPoint[1][0].g >> 5) & 1) << 21;
block.x |= ((endPoint[1][0].b >> 5) & 1) << 22;
block.x |= ((endPoint[1][1].b >> 2) & 1) << 23;
block.x |= ((endPoint[1][0].g >> 4) & 1) << 24;
block.x |= ((endPoint[0][0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0][0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0][0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0][0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0][0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0][0].b >> 5) & 1) << 30;
block.x |= ((endPoint[1][1].g >> 5) & 1) << 31;
block.y |= ((endPoint[1][1].b >> 3) & 1) << 0;
block.y |= ((endPoint[1][1].b >> 5) & 1) << 1;
block.y |= ((endPoint[1][1].b >> 4) & 1) << 2;
block.y |= ((endPoint[0][1].r >> 0) & 1) << 3;
block.y |= ((endPoint[0][1].r >> 1) & 1) << 4;
block.y |= ((endPoint[0][1].r >> 2) & 1) << 5;
block.y |= ((endPoint[0][1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0][1].r >> 4) & 1) << 7;
block.y |= ((endPoint[0][1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1][0].g >> 0) & 1) << 9;
block.y |= ((endPoint[1][0].g >> 1) & 1) << 10;
block.y |= ((endPoint[1][0].g >> 2) & 1) << 11;
block.y |= ((endPoint[1][0].g >> 3) & 1) << 12;
block.y |= ((endPoint[0][1].g >> 0) & 1) << 13;
block.y |= ((endPoint[0][1].g >> 1) & 1) << 14;
block.y |= ((endPoint[0][1].g >> 2) & 1) << 15;
block.y |= ((endPoint[0][1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0][1].g >> 4) & 1) << 17;
block.y |= ((endPoint[0][1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1][1].g >> 0) & 1) << 19;
block.y |= ((endPoint[1][1].g >> 1) & 1) << 20;
block.y |= ((endPoint[1][1].g >> 2) & 1) << 21;
block.y |= ((endPoint[1][1].g >> 3) & 1) << 22;
block.y |= ((endPoint[0][1].b >> 0) & 1) << 23;
block.y |= ((endPoint[0][1].b >> 1) & 1) << 24;
block.y |= ((endPoint[0][1].b >> 2) & 1) << 25;
block.y |= ((endPoint[0][1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0][1].b >> 4) & 1) << 27;
block.y |= ((endPoint[0][1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1][0].b >> 0) & 1) << 29;
block.y |= ((endPoint[1][0].b >> 1) & 1) << 30;
block.y |= ((endPoint[1][0].b >> 2) & 1) << 31;
block.z |= ((endPoint[1][0].b >> 3) & 1) << 0;
block.z |= ((endPoint[1][0].r >> 0) & 1) << 1;
block.z |= ((endPoint[1][0].r >> 1) & 1) << 2;
block.z |= ((endPoint[1][0].r >> 2) & 1) << 3;
block.z |= ((endPoint[1][0].r >> 3) & 1) << 4;
block.z |= ((endPoint[1][0].r >> 4) & 1) << 5;
block.z |= ((endPoint[1][0].r >> 5) & 1) << 6;
block.z |= ((endPoint[1][1].r >> 0) & 1) << 7;
block.z |= ((endPoint[1][1].r >> 1) & 1) << 8;
block.z |= ((endPoint[1][1].r >> 2) & 1) << 9;
block.z |= ((endPoint[1][1].r >> 3) & 1) << 10;
block.z |= ((endPoint[1][1].r >> 4) & 1) << 11;
block.z |= ((endPoint[1][1].r >> 5) & 1) << 12;
block.z |= ((partition_index >> 0) & 1) << 13;
block.z |= ((partition_index >> 1) & 1) << 14;
block.z |= ((partition_index >> 2) & 1) << 15;
block.z |= ((partition_index >> 3) & 1) << 16;
block.z |= ((partition_index >> 4) & 1) << 17;
}
}
void block_package( inout uint4 block, int2x3 endPoint, uint mode_type ) // for mode 11 - 14
{
/*block.x = ( ( endPoint[0].r << 5 ) & 0x00007FE0 ) | ( ( endPoint[0].g << 15 ) & 0x01FF8000 ) | ( ( endPoint[0].b << 25 ) & 0xFE000000 );
block.y |= ( endPoint[0].b >> 7 ) & 0x00000007;*/
block.xy = 0;
block.z &= 0xFFFFFFFE;
if ( mode_type == candidateModeFlag[10])
{
/* block.x |= candidateModeMemory[10];
block.y |= ( ( endPoint[1].r << 3 ) & 0x00001FF8 ) | ( ( endPoint[1].g << 13 ) & 0x007FE000 ) | ( ( endPoint[1].b << 23 ) & 0xFF800000 );
block.z |= ( endPoint[1].b >> 9 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[10] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[10] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[10] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[10] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[10] >> 4) & 1) << 4;
block.x |= ((endPoint[0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0].b >> 9) & 1) << 2;
block.y |= ((endPoint[1].r >> 0) & 1) << 3;
block.y |= ((endPoint[1].r >> 1) & 1) << 4;
block.y |= ((endPoint[1].r >> 2) & 1) << 5;
block.y |= ((endPoint[1].r >> 3) & 1) << 6;
block.y |= ((endPoint[1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1].r >> 6) & 1) << 9;
block.y |= ((endPoint[1].r >> 7) & 1) << 10;
block.y |= ((endPoint[1].r >> 8) & 1) << 11;
block.y |= ((endPoint[1].r >> 9) & 1) << 12;
block.y |= ((endPoint[1].g >> 0) & 1) << 13;
block.y |= ((endPoint[1].g >> 1) & 1) << 14;
block.y |= ((endPoint[1].g >> 2) & 1) << 15;
block.y |= ((endPoint[1].g >> 3) & 1) << 16;
block.y |= ((endPoint[1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1].g >> 6) & 1) << 19;
block.y |= ((endPoint[1].g >> 7) & 1) << 20;
block.y |= ((endPoint[1].g >> 8) & 1) << 21;
block.y |= ((endPoint[1].g >> 9) & 1) << 22;
block.y |= ((endPoint[1].b >> 0) & 1) << 23;
block.y |= ((endPoint[1].b >> 1) & 1) << 24;
block.y |= ((endPoint[1].b >> 2) & 1) << 25;
block.y |= ((endPoint[1].b >> 3) & 1) << 26;
block.y |= ((endPoint[1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1].b >> 6) & 1) << 29;
block.y |= ((endPoint[1].b >> 7) & 1) << 30;
block.y |= ((endPoint[1].b >> 8) & 1) << 31;
block.z |= ((endPoint[1].b >> 9) & 1) << 0;
}
else if (mode_type == candidateModeFlag[11])
{
/*block.x |= candidateModeMemory[11];
block.y |= ( ( endPoint[0].r << 2 ) & 0x00001000 ) | ( ( endPoint[0].g << 12 ) & 0x00400000 );
block.y |= ( ( endPoint[1].r << 3 ) & 0x00000FF8 ) | ( ( endPoint[1].g << 13 ) & 0x003FE000 ) | ( ( endPoint[1].b << 23 ) & 0xFF800000 );
block.z |= ( endPoint[0].b >> 10 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[11] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[11] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[11] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[11] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[11] >> 4) & 1) << 4;
block.x |= ((endPoint[0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0].b >> 9) & 1) << 2;
block.y |= ((endPoint[1].r >> 0) & 1) << 3;
block.y |= ((endPoint[1].r >> 1) & 1) << 4;
block.y |= ((endPoint[1].r >> 2) & 1) << 5;
block.y |= ((endPoint[1].r >> 3) & 1) << 6;
block.y |= ((endPoint[1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1].r >> 6) & 1) << 9;
block.y |= ((endPoint[1].r >> 7) & 1) << 10;
block.y |= ((endPoint[1].r >> 8) & 1) << 11;
block.y |= ((endPoint[0].r >> 10) & 1) << 12;
block.y |= ((endPoint[1].g >> 0) & 1) << 13;
block.y |= ((endPoint[1].g >> 1) & 1) << 14;
block.y |= ((endPoint[1].g >> 2) & 1) << 15;
block.y |= ((endPoint[1].g >> 3) & 1) << 16;
block.y |= ((endPoint[1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1].g >> 6) & 1) << 19;
block.y |= ((endPoint[1].g >> 7) & 1) << 20;
block.y |= ((endPoint[1].g >> 8) & 1) << 21;
block.y |= ((endPoint[0].g >> 10) & 1) << 22;
block.y |= ((endPoint[1].b >> 0) & 1) << 23;
block.y |= ((endPoint[1].b >> 1) & 1) << 24;
block.y |= ((endPoint[1].b >> 2) & 1) << 25;
block.y |= ((endPoint[1].b >> 3) & 1) << 26;
block.y |= ((endPoint[1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1].b >> 6) & 1) << 29;
block.y |= ((endPoint[1].b >> 7) & 1) << 30;
block.y |= ((endPoint[1].b >> 8) & 1) << 31;
block.z |= ((endPoint[0].b >> 10) & 1) << 0;
}
else if (mode_type == candidateModeFlag[12])// violate the spec in [0].low
{
/*block.x |= candidateModeMemory[12];
block.y |= ( ( endPoint[0].r << 2 ) & 0x00001000 ) | ( ( endPoint[0].g << 12 ) & 0x00400000 );
block.y |= ( ( endPoint[0].r << 0 ) & 0x00000800 ) | ( ( endPoint[0].g << 10 ) & 0x00200000 );
block.y |= ( endPoint[0].b << 20 ) & 0x80000000;
block.y |= ( ( endPoint[1].r << 3 ) & 0x000007F8 ) | ( ( endPoint[1].g << 13 ) & 0x001FE000 ) | ( ( endPoint[1].b << 23 ) & 0x7F800000 );
block.z |= ( endPoint[0].b >> 10 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[12] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[12] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[12] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[12] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[12] >> 4) & 1) << 4;
block.x |= ((endPoint[0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0].b >> 9) & 1) << 2;
block.y |= ((endPoint[1].r >> 0) & 1) << 3;
block.y |= ((endPoint[1].r >> 1) & 1) << 4;
block.y |= ((endPoint[1].r >> 2) & 1) << 5;
block.y |= ((endPoint[1].r >> 3) & 1) << 6;
block.y |= ((endPoint[1].r >> 4) & 1) << 7;
block.y |= ((endPoint[1].r >> 5) & 1) << 8;
block.y |= ((endPoint[1].r >> 6) & 1) << 9;
block.y |= ((endPoint[1].r >> 7) & 1) << 10;
block.y |= ((endPoint[0].r >> 11) & 1) << 11;
block.y |= ((endPoint[0].r >> 10) & 1) << 12;
block.y |= ((endPoint[1].g >> 0) & 1) << 13;
block.y |= ((endPoint[1].g >> 1) & 1) << 14;
block.y |= ((endPoint[1].g >> 2) & 1) << 15;
block.y |= ((endPoint[1].g >> 3) & 1) << 16;
block.y |= ((endPoint[1].g >> 4) & 1) << 17;
block.y |= ((endPoint[1].g >> 5) & 1) << 18;
block.y |= ((endPoint[1].g >> 6) & 1) << 19;
block.y |= ((endPoint[1].g >> 7) & 1) << 20;
block.y |= ((endPoint[0].g >> 11) & 1) << 21;
block.y |= ((endPoint[0].g >> 10) & 1) << 22;
block.y |= ((endPoint[1].b >> 0) & 1) << 23;
block.y |= ((endPoint[1].b >> 1) & 1) << 24;
block.y |= ((endPoint[1].b >> 2) & 1) << 25;
block.y |= ((endPoint[1].b >> 3) & 1) << 26;
block.y |= ((endPoint[1].b >> 4) & 1) << 27;
block.y |= ((endPoint[1].b >> 5) & 1) << 28;
block.y |= ((endPoint[1].b >> 6) & 1) << 29;
block.y |= ((endPoint[1].b >> 7) & 1) << 30;
block.y |= ((endPoint[0].b >> 11) & 1) << 31;
block.z |= ((endPoint[0].b >> 10) & 1) << 0;
}
else if (mode_type == candidateModeFlag[13])
{
/*block.x |= candidateModeMemory[13];
block.y |= ( ( endPoint[0].r >> 8 ) & 0x00000080 );
block.y |= ( ( endPoint[0].r >> 6 ) & 0x00000100 );
block.y |= ( ( endPoint[0].r >> 4 ) & 0x00000200 );
block.y |= ( ( endPoint[0].r >> 2 ) & 0x00000400 );
block.y |= ( ( endPoint[0].r >> 0 ) & 0x00000800 );
block.y |= ( ( endPoint[0].r << 2 ) & 0x00001000 );
block.y |= ( ( endPoint[0].g << 2 ) & 0x00020000 );
block.y |= ( ( endPoint[0].g << 4 ) & 0x00040000 );
block.y |= ( ( endPoint[0].g << 6 ) & 0x00080000 );
block.y |= ( ( endPoint[0].g << 8 ) & 0x00100000 );
block.y |= ( ( endPoint[0].g << 10 ) & 0x00200000 );
block.y |= ( ( endPoint[0].g << 12 ) & 0x00400000 );
block.y |= ( ( endPoint[0].b << 12 ) & 0x08000000 );
block.y |= ( ( endPoint[0].b << 14 ) & 0x10000000 );
block.y |= ( ( endPoint[0].b << 16 ) & 0x20000000 );
block.y |= ( ( endPoint[0].b << 18 ) & 0x40000000 );
block.y |= ( ( endPoint[0].b << 20 ) & 0x80000000 );
block.y |= ( ( endPoint[1].r << 3 ) & 0x00000078 ) | ( ( endPoint[1].g << 13 ) & 0x0001E000 ) | ( ( endPoint[1].b << 23 ) & 0x07800000 );
block.z |= ( endPoint[0].b >> 10 ) & 0x00000001;*/
block.x |= ((candidateModeMemory[13] >> 0) & 1) << 0;
block.x |= ((candidateModeMemory[13] >> 1) & 1) << 1;
block.x |= ((candidateModeMemory[13] >> 2) & 1) << 2;
block.x |= ((candidateModeMemory[13] >> 3) & 1) << 3;
block.x |= ((candidateModeMemory[13] >> 4) & 1) << 4;
block.x |= ((endPoint[0].r >> 0) & 1) << 5;
block.x |= ((endPoint[0].r >> 1) & 1) << 6;
block.x |= ((endPoint[0].r >> 2) & 1) << 7;
block.x |= ((endPoint[0].r >> 3) & 1) << 8;
block.x |= ((endPoint[0].r >> 4) & 1) << 9;
block.x |= ((endPoint[0].r >> 5) & 1) << 10;
block.x |= ((endPoint[0].r >> 6) & 1) << 11;
block.x |= ((endPoint[0].r >> 7) & 1) << 12;
block.x |= ((endPoint[0].r >> 8) & 1) << 13;
block.x |= ((endPoint[0].r >> 9) & 1) << 14;
block.x |= ((endPoint[0].g >> 0) & 1) << 15;
block.x |= ((endPoint[0].g >> 1) & 1) << 16;
block.x |= ((endPoint[0].g >> 2) & 1) << 17;
block.x |= ((endPoint[0].g >> 3) & 1) << 18;
block.x |= ((endPoint[0].g >> 4) & 1) << 19;
block.x |= ((endPoint[0].g >> 5) & 1) << 20;
block.x |= ((endPoint[0].g >> 6) & 1) << 21;
block.x |= ((endPoint[0].g >> 7) & 1) << 22;
block.x |= ((endPoint[0].g >> 8) & 1) << 23;
block.x |= ((endPoint[0].g >> 9) & 1) << 24;
block.x |= ((endPoint[0].b >> 0) & 1) << 25;
block.x |= ((endPoint[0].b >> 1) & 1) << 26;
block.x |= ((endPoint[0].b >> 2) & 1) << 27;
block.x |= ((endPoint[0].b >> 3) & 1) << 28;
block.x |= ((endPoint[0].b >> 4) & 1) << 29;
block.x |= ((endPoint[0].b >> 5) & 1) << 30;
block.x |= ((endPoint[0].b >> 6) & 1) << 31;
block.y |= ((endPoint[0].b >> 7) & 1) << 0;
block.y |= ((endPoint[0].b >> 8) & 1) << 1;
block.y |= ((endPoint[0].b >> 9) & 1) << 2;
block.y |= ((endPoint[1].r >> 0) & 1) << 3;
block.y |= ((endPoint[1].r >> 1) & 1) << 4;
block.y |= ((endPoint[1].r >> 2) & 1) << 5;
block.y |= ((endPoint[1].r >> 3) & 1) << 6;
block.y |= ((endPoint[0].r >> 15) & 1) << 7;
block.y |= ((endPoint[0].r >> 14) & 1) << 8;
block.y |= ((endPoint[0].r >> 13) & 1) << 9;
block.y |= ((endPoint[0].r >> 12) & 1) << 10;
block.y |= ((endPoint[0].r >> 11) & 1) << 11;
block.y |= ((endPoint[0].r >> 10) & 1) << 12;
block.y |= ((endPoint[1].g >> 0) & 1) << 13;
block.y |= ((endPoint[1].g >> 1) & 1) << 14;
block.y |= ((endPoint[1].g >> 2) & 1) << 15;
block.y |= ((endPoint[1].g >> 3) & 1) << 16;
block.y |= ((endPoint[0].g >> 15) & 1) << 17;
block.y |= ((endPoint[0].g >> 14) & 1) << 18;
block.y |= ((endPoint[0].g >> 13) & 1) << 19;
block.y |= ((endPoint[0].g >> 12) & 1) << 20;
block.y |= ((endPoint[0].g >> 11) & 1) << 21;
block.y |= ((endPoint[0].g >> 10) & 1) << 22;
block.y |= ((endPoint[1].b >> 0) & 1) << 23;
block.y |= ((endPoint[1].b >> 1) & 1) << 24;
block.y |= ((endPoint[1].b >> 2) & 1) << 25;
block.y |= ((endPoint[1].b >> 3) & 1) << 26;
block.y |= ((endPoint[0].b >> 15) & 1) << 27;
block.y |= ((endPoint[0].b >> 14) & 1) << 28;
block.y |= ((endPoint[0].b >> 13) & 1) << 29;
block.y |= ((endPoint[0].b >> 12) & 1) << 30;
block.y |= ((endPoint[0].b >> 11) & 1) << 31;
block.z |= ((endPoint[0].b >> 10) & 1) << 0;
}
}