You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nvidia-texture-tools/extern/CMP_Core/shaders/BC7_Encode_Kernel.h

1739 lines
61 KiB
C

//=====================================================================
// Copyright (c) 2020 Advanced Micro Devices, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files(the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions :
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
//
//=====================================================================
#ifndef BC7_ENCODE_KERNEL_H
#define BC7_ENCODE_KERNEL_H
#pragma warning(disable:4505) // disable warnings on unreferenced local function has been removed
#if defined(ISPC)||defined(ASPM)
//#include "..\..\Common\Common_Def.h"
#include "Common_Def.h"
#else
#include "Common_Def.h"
#endif
// cmp param uniform data tracking
typedef CGU_UINT8 CGU_CHANNEL;
typedef CGV_UINT32 CGV_SHIFT32;
typedef CGV_UINT8 CGV_BYTE;
typedef CGV_FLOAT CGV_ERROR;
typedef CGV_FLOAT CGV_IMAGE;
typedef CGV_INT CGV_EPOCODE;
typedef CGV_UINT8 CGV_CMPOUT;
typedef CGV_UINT8 CGV_INDEX;
typedef CGV_UINT32 CGV_INDEXPACKED;
typedef CGV_UINT32 CGV_CMPOUTPACKED;
typedef CGV_INT CGV_LEVELS;
typedef CGV_INT CGV_SUBSETS;
typedef CGV_INT CGV_MASK;
typedef CGV_INT CGV_ITTERATIONS;
typedef CGV_INT CGV_PARTID;
typedef CGV_INT CGV_FIXUPINDEX;
typedef CGV_INT CGV_RAMP;
typedef CGV_INT CGV_ENTRIES;
typedef CGV_INT CGV_TYPEINT;
typedef CGV_UINT32 CGV_TYPEUINT32;
typedef CGU_UINT8 CGU_BYTE;
typedef CGV_CMPOUT CGUV_CMPOUT;
typedef CGU_UINT8 CGUV_DSTPTR;
#define USE_VARYING
#ifdef USE_VARYING
typedef CGV_INT CGUV_BLOCKWIDTH;
#else
typedef CGU_INT CGUV_BLOCKWIDTH;
#endif
#ifndef ASPM_GPU
struct cmp_bc7_state
{
CGV_IMAGE block[16][4];
CGV_SHIFT32 best_data[4];
} ;
typedef enum
{
CGU_FORMAT_Unknown, // Undefined texture format.
// Channel Component formats-------------------------------------------------------------------------------
CGU_FORMAT_RGBA_8888, // RGBA format with 8-bit fixed channels.
// Formats supported by GPU
CGU_FORMAT_BC1, // A four component opaque (or 1-bit alpha) compressed texture format for Microsoft DirectX10. Identical to DXT1. Four bits per pixel.
CGU_FORMAT_BC6H, // BC6H compressed texture format
CGU_FORMAT_BC7, // BC7 compressed texture format
// Formats supported by CPU
CGU_FORMAT_GTC, // GTC Gradient Texture Compressor
CGU_FORMAT_MAX
} CGU_FORMAT;
//------------------------------------
// The structure describing a texture
//------------------------------------
struct CGU_Texture_Type
{
// Optional Settings
CGU_FLOAT m_fquality; // Minimum resulting quality to maintain while processing the texture, default is 0.05
CGU_INT8 m_nBlockHeight; // Size of the texture tiles (blocks) to use.during processing
CGU_INT8 m_nBlockWidth; // default = 4
CGU_INT8 m_nBlockDepth; // default = 1
// Required settings
CGU_FORMAT m_format; // Texture format
CGU_UINT32 m_src_width; // Width of the texture.
CGU_UINT32 m_src_height; // Height of the texture.
CGU_UINT32 m_stride; // Number of bytes to start of next line
CGU_UINT32 m_dwDataSize; // Size of the allocated texture data.
CGU_UINT8* m_pData; // Pointer to the texture data
};
#endif // End of ASPM_CPU
#define SOURCE_BLOCK_SIZE 16 // Size of a source block in pixels (each pixel has RGBA:8888 channels)
#define COMPRESSED_BLOCK_SIZE 16 // Size of a compressed block in bytes
#define MAX_CHANNELS 4
#define MAX_SUBSETS 3 // Maximum number of possible subsets
#define MAX_SUBSET_SIZE 16 // Largest possible size for an individual subset
#define BC7_qFAST_THRESHOLD 0.50f
#define MAX_INDEX_BITS 4 // Maximum number of index bits
typedef struct
{
CGV_IMAGE image;
CGV_INDEX index;
} CMP_di;
typedef struct
{
CGV_IMAGE image;
CGV_UINT8 index;
} CMP_du;
#define MAX_PARTITION_ENTRIES 64
#define MAX_PARTITIONS_TABLE 193
#define MAX_PARTITIONS 64 // Maximum number of partition types
#define EPSILON 0.00390625f
#define DIMENSION 4
#define BlockX 4
#define BlockY 4
#define QUANT_RT 250.0f // quality = 0.05f
//==========================================================================================================
#define LOG_CL_RANGE 5
#define LOG_CL_BASE 2
#define BIT_BASE 5
#define BIT_RANGE 9
#define MAX_CLUSTERS_BIG 16
#define MAX_CLUSTERS 8
#define BTT(bits) (bits-BIT_BASE)
#define CLT(cl) (cl-LOG_CL_BASE)
#define MAX_TRY_QUANT_TRACE 2 // used in optQuantTrace_d : increasing this has no gain in quality!, keep it set at 2
#define MAX_TRY_SHAKER 5 // used in ep_shaker_2_d if set at 4 PSNR drops by -0.1 SSIM stays the same
#define NUM_BLOCK_TYPES 8 // Number of block types in the format
#define BC7_MAX_TRACE 25000
// If this is defined, ramp calculation is done via math floor and division.
// Otherwise, ramp calculation is done by bit shifting
#define USE_HIGH_PRECISION_INTERPOLATION_BC7
typedef struct
{
CGU_INT32 k;
CGV_FLOAT d;
} TRACE;
typedef struct
#ifdef ASPM
BC7_EncodeState
#endif
{
CGV_IMAGE image_src[64];
CGV_CMPOUT cmp_out[COMPRESSED_BLOCK_SIZE];
// Common
CGV_ERROR opaque_err; // error for coding alpha=255
CGV_ERROR best_err;
// set per mode
CGU_CHANNEL channels3or4;
CGU_UINT8 bits;
CGU_INT clusters;
CGU_BYTE componentBits;
CGU_UINT8 numPartitionModes;
CGU_INT maxSubSets;
CGU_UINT8 numClusters0[2];
CGU_UINT8 numClusters1[2];
CGU_UINT8 max_idxMode;
CGU_INT modeBits[2];
CGU_BOOL optimizedQ;
CGU_UINT32 validModeMask;
CGU_INT part_count;
CGU_CHANNEL channels;
// use_icmp
CGV_CMPOUTPACKED best_cmp_out[5];
CGV_BOOL cmp_isout16Bytes;
CGU_INT refineIterations;
CGU_INT fastSkipTreshold;
}
#ifndef ASPM
BC7_EncodeState
#endif
;
typedef struct
#ifdef ASPM
cmp_mode_parameters
#endif
{
CGV_EPOCODE color_qendpoint[8];
CGV_EPOCODE alpha_qendpoint[8];
CGV_INDEXPACKED best_color_index[2];
CGV_INDEXPACKED best_alpha_index[2];
CGV_INDEX color_index[SOURCE_BLOCK_SIZE];
CGV_INDEX alpha_index[SOURCE_BLOCK_SIZE];
CGV_SHIFT32 idxMode;
CGV_SHIFT32 rotated_channel;
}
#ifndef ASPM
cmp_mode_parameters
#endif
;
typedef struct
#ifdef ASPM
BC7_Encode
#endif
{
// Global data setup at initialization time
CGU_FLOAT quality; // range is 0 to 1
CGU_FLOAT errorThreshold; // use 5 to 75
CGU_UINT32 validModeMask; // bit for mode masks def to 0xFF
CGU_BOOL imageNeedsAlpha; // default: false
CGU_BOOL colourRestrict; // default: false
CGU_BOOL alphaRestrict; // default: false
// Used to track errors in internal state code
CGV_ERROR opaque_err;
CGV_ERROR best_err;
CGU_FLOAT minThreshold;
CGU_FLOAT maxThreshold;;
// icmp code settings
CGU_INT refineIterations;
CGU_INT part_count;
CGU_INT channels;
}
#ifndef ASPM
BC7_Encode
#endif
;
CMP_CONSTANT CGU_FLOAT rampWeights[5][SOURCE_BLOCK_SIZE] = {
{ 0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 0 bit index
{ 0.000000f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 1 bit index
{ 0.000000f,0.328125f,0.671875f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 2 bit index
{ 0.000000f,0.140625f,0.281250f,0.421875f,0.578125f,0.718750f,0.859375f,1.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f,0.000000f}, // 3 bit index
{ 0.000000f,0.062500f,0.140625f,0.203125f,0.265625f,0.328125f,0.406250f,0.468750f,0.531250f,0.593750f,0.671875f,0.734375f,0.796875f,0.859375f,0.937500f,1.000000f} // 4 bit index
};
#ifndef ASPM_GPU
typedef struct
#ifdef ASPM
BC7_EncodeRamps
#endif
{
CGU_INT ep_d[4][256];
#ifdef USE_BC7_SP_ERR_IDX
CGU_UINT8 sp_err[3*4*256*2*2*16];
CGU_INT sp_idx[3*4*256*2*2*16*2];
#endif
#ifdef USE_BC7_RAMP
CGU_FLOAT ramp[3*4*256*256*16];
#endif
CGU_BOOL ramp_init;
}
#ifndef ASPM
BC7_EncodeRamps
#endif
;
#endif
CMP_CONSTANT CGU_UINT8 npv_nd[2][8] = {
{1,2,4,8,16,32,0,0}, // 3
{1,2,4,0,0 ,0 ,0,0} // 4
};
typedef enum
{
NO_ALPHA,
COMBINED_ALPHA,
SEPARATE_ALPHA
} CMP_BCE;
// Endpoint encoding type
typedef enum
{
NO_PBIT,
ONE_PBIT,
TWO_PBIT,
THREE_PBIT,
FOUR_PBIT,
FIVE_PBIT
} CMP_PBIT;
typedef struct
#ifdef ASPM
BC7_Encode_local
#endif
{
// Data for compressing a particular block mode
CGV_INT clusters[2];
CGV_BYTE parityBits;
CGV_BYTE componentBits[MAX_CHANNELS];
CMP_BCE encodingType; // Type of block
CGU_UINT8 partitionBits; // Number of bits for partition data
CGU_UINT8 rotationBits; // Number of bits for component rotation
CGU_UINT8 indexModeBits; // Number of bits for index selection
CMP_PBIT pBitType; // Type of P-bit encoding
CGU_UINT8 subsetCount; // Number of subsets
CGU_UINT8 indexBits[2]; // Number of bits per index in each index set
// Bulky temporary data used during compression of a block
CGV_UINT8 storedindex[MAX_PARTITIONS][MAX_SUBSETS][MAX_SUBSET_SIZE];
CGV_ERROR storedError[MAX_PARTITIONS];
CGV_UINT8 sortedModes[MAX_PARTITIONS];
// This stores the min and max for the components of the block, and the ranges
CGV_IMAGE blockMin[MAX_CHANNELS];
CGV_IMAGE blockMax[MAX_CHANNELS];
CGV_IMAGE blockRange[MAX_CHANNELS];
CGV_IMAGE blockMaxRange;
}
#ifndef ASPM
BC7_Encode_local
#endif
;
typedef enum
{
CART,
SAME_PAR,
BCC,
SAME_FCC,
FCC,
FCC_SAME_BCC,
} CMP_qt;
// Block component encoding
// Descriptor structure for block encodings
typedef struct
{
uniform CMP_BCE encodingType; // Type of block
CGU_UINT8 partitionBits; // Number of bits for partition data
CGU_UINT8 rotationBits; // Number of bits for component rotation
CGU_UINT8 indexModeBits; // Number of bits for index selection
CGU_UINT8 scalarBits; // Number of bits for one scalar endpoint
CGU_UINT8 vectorBits; // Number of bits for one vector endpoint(excluding P bits)
uniform CMP_PBIT pBitType; // Type of P-bit encoding
CGU_UINT8 subsetCount; // Number of subsets
CGU_UINT8 indexBits[2]; // Number of bits per index in each index set
} CMP_BTI;
typedef enum
{
COMP_RED = 0,
COMP_GREEN = 1,
COMP_BLUE = 2,
COMP_ALPHA = 3
} COMPONENT;
CMP_CONSTANT CGU_UINT8 componentRotations[4][4] = {
{ COMP_ALPHA, COMP_RED, COMP_GREEN, COMP_BLUE },
{ COMP_RED, COMP_ALPHA, COMP_GREEN, COMP_BLUE },
{ COMP_GREEN, COMP_RED, COMP_ALPHA, COMP_BLUE },
{ COMP_BLUE, COMP_RED, COMP_GREEN, COMP_ALPHA }
};
CMP_CONSTANT CMP_BTI bti[NUM_BLOCK_TYPES] = {
//encodingType,partitionBits,rotationBits,indexModeBits,scalarBits,vectorBits,pBitType, subsetCount,indexBits[0]&[1]
{ NO_ALPHA, 4, 0, 0, 0, 12, TWO_PBIT, 3, { 3, 0 } }, // Format Mode 0
{ NO_ALPHA, 6, 0, 0, 0, 18, ONE_PBIT, 2, { 3, 0 } }, // Format Mode 1
{ NO_ALPHA, 6, 0, 0, 0, 15, NO_PBIT, 3, { 2, 0 } }, // Format Mode 2
{ NO_ALPHA, 6, 0, 0, 0, 21, TWO_PBIT, 2, { 2, 0 } }, // Format Mode 3
{ SEPARATE_ALPHA, 0, 2, 1, 6, 15, NO_PBIT, 1, { 2, 3 } }, // Format Mode 4
{ SEPARATE_ALPHA, 0, 2, 0, 8, 21, NO_PBIT, 1, { 2, 2 } }, // Format Mode 5
{ COMBINED_ALPHA, 0, 0, 0, 0, 28, TWO_PBIT, 1, { 4, 0 } }, // Format Mode 6
{ COMBINED_ALPHA, 6, 0, 0, 0, 20, TWO_PBIT, 2, { 2, 0 } } // Format Mode 7
};
CMP_CONSTANT CGU_UINT8 par_vectors_nd[2][8][64][2][4] = {
{ // 3D
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,1,0},{1,1,1,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{1,1,1,0}},{{1,1,1,0},{0,0,0,0}},{{1,1,1,0},{1,1,1,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{1,1,0,0}},{{1,0,1,0},{1,0,1,0}},{{0,1,1,0},{0,1,1,0}},{{0,0,0,0},{1,1,1,0}},{{1,1,1,0},{0,0,0,0}},{{0,1,0,0},{0,1,0,0}},{{1,1,1,0},{1,1,1,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,0,0,0}},{{1,0,1,0},{0,0,0,0}},{{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{1,1,0,0}},{{1,1,0,0},{1,1,0,0}},{{1,0,1,0},{1,1,0,0}},{{0,1,1,0},{1,1,0,0}},
{{0,0,0,0},{1,0,1,0}},{{1,1,0,0},{1,0,1,0}},{{1,0,1,0},{1,0,1,0}},{{0,1,1,0},{1,0,1,0}},{{0,0,0,0},{0,1,1,0}},{{1,1,0,0},{0,1,1,0}},{{1,0,1,0},{0,1,1,0}},{{0,1,1,0},{0,1,1,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,0,0},{0,0,0,0}},{{1,0,1,0},{0,0,0,0}},{{0,1,1,0},{0,0,0,0}},{{0,0,0,0},{1,1,0,0}},{{1,1,0,0},{1,1,0,0}},{{1,0,1,0},{1,1,0,0}},{{0,1,1,0},{1,1,0,0}},
{{0,0,0,0},{1,0,1,0}},{{1,1,0,0},{1,0,1,0}},{{1,0,1,0},{1,0,1,0}},{{0,1,1,0},{1,0,1,0}},{{0,0,0,0},{0,1,1,0}},{{1,1,0,0},{0,1,1,0}},{{1,0,1,0},{0,1,1,0}},{{0,1,1,0},{0,1,1,0}},
{{1,0,0,0},{1,1,1,0}},{{0,1,0,0},{1,1,1,0}},{{0,0,1,0},{1,1,1,0}},{{1,1,1,0},{1,1,1,0}},{{1,0,0,0},{0,0,1,0}},{{0,1,0,0},{0,0,1,0}},{{0,0,1,0},{0,0,1,0}},{{1,1,1,0},{0,0,1,0}},
{{1,0,0,0},{1,0,0,0}},{{0,1,0,0},{1,0,0,0}},{{0,0,1,0},{1,0,0,0}},{{1,1,1,0},{1,0,0,0}},{{1,0,0,0},{0,1,0,0}},{{0,1,0,0},{0,1,0,0}},{{0,0,1,0},{0,1,0,0}},{{1,1,1,0},{0,1,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
},
{ // 4D
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{1,1,1,1},{1,1,1,1}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{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}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,1}},{{0,1,1,1},{0,0,0,0}},{{0,1,1,1},{0,1,1,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,1,1,1}},{{1,1,1,1},{1,0,0,0}},{{1,1,1,1},{1,1,1,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,1,1,1}},{{0,1,1,1},{0,0,0,0}},{{0,1,1,1},{0,1,1,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,1,1,1}},{{1,1,1,1},{1,0,0,0}},{{1,1,1,1},{1,1,1,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,1,1}},{{0,0,1,1},{0,0,0,0}},{{0,1,0,1},{0,1,0,1}},{{1,0,0,0},{1,0,0,0}},{{1,0,0,0},{1,0,1,1}},{{1,0,1,1},{1,0,0,0}},{{1,1,0,1},{1,1,0,1}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
{
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},
{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}},{{0,0,0,0},{0,0,0,0}}
},
},
};
CMP_CONSTANT CGU_UINT32 subset_mask_table[] = {
// 2 subset region patterns
0x0000CCCCu, // 0 1100 1100 1100 1100 (MSB..LSB)
0x00008888u, // 1 1000 1000 1000 1000
0x0000EEEEu, // 2 1110 1110 1110 1110
0x0000ECC8u, // 3 1110 1100 1100 1000
0x0000C880u, // 4 1100 1000 1000 0000
0x0000FEECu, // 5 1111 1110 1110 1100
0x0000FEC8u, // 6 1111 1110 1100 1000
0x0000EC80u, // 7 1110 1100 1000 0000
0x0000C800u, // 8 1100 1000 0000 0000
0x0000FFECu, // 9 1111 1111 1110 1100
0x0000FE80u, // 10 1111 1110 1000 0000
0x0000E800u, // 11 1110 1000 0000 0000
0x0000FFE8u, // 12 1111 1111 1110 1000
0x0000FF00u, // 13 1111 1111 0000 0000
0x0000FFF0u, // 14 1111 1111 1111 0000
0x0000F000u, // 15 1111 0000 0000 0000
0x0000F710u, // 16 1111 0111 0001 0000
0x0000008Eu, // 17 0000 0000 1000 1110
0x00007100u, // 18 0111 0001 0000 0000
0x000008CEu, // 19 0000 1000 1100 1110
0x0000008Cu, // 20 0000 0000 1000 1100
0x00007310u, // 21 0111 0011 0001 0000
0x00003100u, // 22 0011 0001 0000 0000
0x00008CCEu, // 23 1000 1100 1100 1110
0x0000088Cu, // 24 0000 1000 1000 1100
0x00003110u, // 25 0011 0001 0001 0000
0x00006666u, // 26 0110 0110 0110 0110
0x0000366Cu, // 27 0011 0110 0110 1100
0x000017E8u, // 28 0001 0111 1110 1000
0x00000FF0u, // 29 0000 1111 1111 0000
0x0000718Eu, // 30 0111 0001 1000 1110
0x0000399Cu, // 31 0011 1001 1001 1100
0x0000AAAAu, // 32 1010 1010 1010 1010
0x0000F0F0u, // 33 1111 0000 1111 0000
0x00005A5Au, // 34 0101 1010 0101 1010
0x000033CCu, // 35 0011 0011 1100 1100
0x00003C3Cu, // 36 0011 1100 0011 1100
0x000055AAu, // 37 0101 0101 1010 1010
0x00009696u, // 38 1001 0110 1001 0110
0x0000A55Au, // 39 1010 0101 0101 1010
0x000073CEu, // 40 0111 0011 1100 1110
0x000013C8u, // 41 0001 0011 1100 1000
0x0000324Cu, // 42 0011 0010 0100 1100
0x00003BDCu, // 43 0011 1011 1101 1100
0x00006996u, // 44 0110 1001 1001 0110
0x0000C33Cu, // 45 1100 0011 0011 1100
0x00009966u, // 46 1001 1001 0110 0110
0x00000660u, // 47 0000 0110 0110 0000
0x00000272u, // 48 0000 0010 0111 0010
0x000004E4u, // 49 0000 0100 1110 0100
0x00004E40u, // 50 0100 1110 0100 0000
0x00002720u, // 51 0010 0111 0010 0000
0x0000C936u, // 52 1100 1001 0011 0110
0x0000936Cu, // 53 1001 0011 0110 1100
0x000039C6u, // 54 0011 1001 1100 0110
0x0000639Cu, // 55 0110 0011 1001 1100
0x00009336u, // 56 1001 0011 0011 0110
0x00009CC6u, // 57 1001 1100 1100 0110
0x0000817Eu, // 58 1000 0001 0111 1110
0x0000E718u, // 59 1110 0111 0001 1000
0x0000CCF0u, // 60 1100 1100 1111 0000
0x00000FCCu, // 61 0000 1111 1100 1100
0x00007744u, // 62 0111 0111 0100 0100
0x0000EE22u, // 63 1110 1110 0010 0010
// 3 Subset region patterns
0xF60008CCu,// 0 1111 0110 0000 0000 : 0000 1000 1100 1100 = 2222122011001100 (MSB...LSB)
0x73008CC8u,// 1 0111 0011 0000 0000 : 1000 1100 1100 1000 = 1222112211001000
0x3310CC80u,// 2 0011 0011 0001 0000 : 1100 1100 1000 0000 = 1122112210020000
0x00CEEC00u,// 3 0000 0000 1100 1110 : 1110 1100 0000 0000 = 1110110022002220
0xCC003300u,// 4 1100 1100 0000 0000 : 0011 0011 0000 0000 = 2211221100000000
0xCC0000CCu,// 5 1100 1100 0000 0000 : 0000 0000 1100 1100 = 2200220011001100
0x00CCFF00u,// 6 0000 0000 1100 1100 : 1111 1111 0000 0000 = 1111111122002200
0x3300CCCCu,// 7 0011 0011 0000 0000 : 1100 1100 1100 1100 = 1122112211001100
0xF0000F00u,// 8 1111 0000 0000 0000 : 0000 1111 0000 0000 = 2222111100000000
0xF0000FF0u,// 9 1111 0000 0000 0000 : 0000 1111 1111 0000 = 2222111111110000
0xFF0000F0u,// 10 1111 1111 0000 0000 : 0000 0000 1111 0000 = 2222222211110000
0x88884444u,// 11 1000 1000 1000 1000 : 0100 0100 0100 0100 = 2100210021002100
0x88886666u,// 12 1000 1000 1000 1000 : 0110 0110 0110 0110 = 2110211021102110
0xCCCC2222u,// 13 1100 1100 1100 1100 : 0010 0010 0010 0010 = 2210221022102210
0xEC80136Cu,// 14 1110 1100 1000 0000 : 0001 0011 0110 1100 = 2221221121101100
0x7310008Cu,// 15 0111 0011 0001 0000 : 0000 0000 1000 1100 = 0222002210021100
0xC80036C8u,// 16 1100 1000 0000 0000 : 0011 0110 1100 1000 = 2211211011001000
0x310008CEu,// 17 0011 0001 0000 0000 : 0000 1000 1100 1110 = 0022100211001110
0xCCC03330u,// 18 1100 1100 1100 0000 : 0011 0011 0011 0000 = 2211221122110000
0x0CCCF000u,// 19 0000 1100 1100 1100 : 1111 0000 0000 0000 = 1111220022002200
0xEE0000EEu,// 20 1110 1110 0000 0000 : 0000 0000 1110 1110 = 2220222011101110
0x77008888u,// 21 0111 0111 0000 0000 : 1000 1000 1000 1000 = 1222122210001000
0xCC0022C0u,// 22 1100 1100 0000 0000 : 0010 0010 1100 0000 = 2210221011000000
0x33004430u,// 23 0011 0011 0000 0000 : 0100 0100 0011 0000 = 0122012200110000
0x00CC0C22u,// 24 0000 0000 1100 1100 : 0000 1100 0010 0010 = 0000110022102210
0xFC880344u,// 25 1111 1100 1000 1000 : 0000 0011 0100 0100 = 2222221121002100
0x06606996u,// 26 0000 0110 0110 0000 : 0110 1001 1001 0110 = 0110122112210110
0x66009960u,// 27 0110 0110 0000 0000 : 1001 1001 0110 0000 = 1221122101100000
0xC88C0330u,// 28 1100 1000 1000 1100 : 0000 0011 0011 0000 = 2200201120112200
0xF9000066u,// 29 1111 1001 0000 0000 : 0000 0000 0110 0110 = 2222200201100110
0x0CC0C22Cu,// 30 0000 1100 1100 0000 : 1100 0010 0010 1100 = 1100221022101100
0x73108C00u,// 31 0111 0011 0001 0000 : 1000 1100 0000 0000 = 1222112200020000
0xEC801300u,// 32 1110 1100 1000 0000 : 0001 0011 0000 0000 = 2221221120000000
0x08CEC400u,// 33 0000 1000 1100 1110 : 1100 0100 0000 0000 = 1100210022002220
0xEC80004Cu,// 34 1110 1100 1000 0000 : 0000 0000 0100 1100 = 2220220021001100
0x44442222u,// 35 0100 0100 0100 0100 : 0010 0010 0010 0010 = 0210021002100210
0x0F0000F0u,// 36 0000 1111 0000 0000 : 0000 0000 1111 0000 = 0000222211110000
0x49242492u,// 37 0100 1001 0010 0100 : 0010 0100 1001 0010 = 0210210210210210
0x42942942u,// 38 0100 0010 1001 0100 : 0010 1001 0100 0010 = 0210102121020210
0x0C30C30Cu,// 39 0000 1100 0011 0000 : 1100 0011 0000 1100 = 1100221100221100
0x03C0C03Cu,// 40 0000 0011 1100 0000 : 1100 0000 0011 1100 = 1100002222111100
0xFF0000AAu,// 41 1111 1111 0000 0000 : 0000 0000 1010 1010 = 2222222210101010
0x5500AA00u,// 42 0101 0101 0000 0000 : 1010 1010 0000 0000 = 1212121200000000
0xCCCC3030u,// 43 1100 1100 1100 1100 : 0011 0000 0011 0000 = 2211220022112200
0x0C0CC0C0u,// 44 0000 1100 0000 1100 : 1100 0000 1100 0000 = 1100220011002200
0x66669090u,// 45 0110 0110 0110 0110 : 1001 0000 1001 0000 = 1221022012210220
0x0FF0A00Au,// 46 0000 1111 1111 0000 : 1010 0000 0000 1010 = 1010222222221010
0x5550AAA0u,// 47 0101 0101 0101 0000 : 1010 1010 1010 0000 = 1212121212120000
0xF0000AAAu,// 48 1111 0000 0000 0000 : 0000 1010 1010 1010 = 2222101010101010
0x0E0EE0E0u,// 49 0000 1110 0000 1110 : 1110 0000 1110 0000 = 1110222011102220
0x88887070u,// 50 1000 1000 1000 1000 : 0111 0000 0111 0000 = 2111200021112000
0x99906660u,// 51 1001 1001 1001 0000 : 0110 0110 0110 0000 = 2112211221120000
0xE00E0EE0u,// 52 1110 0000 0000 1110 : 0000 1110 1110 0000 = 2220111011102220
0x88880770u,// 53 1000 1000 1000 1000 : 0000 0111 0111 0000 = 2000211121112000
0xF0000666u,// 54 1111 0000 0000 0000 : 0000 0110 0110 0110 = 2222011001100110
0x99006600u,// 55 1001 1001 0000 0000 : 0110 0110 0000 0000 = 2112211200000000
0xFF000066u,// 56 1111 1111 0000 0000 : 0000 0000 0110 0110 = 2222222201100110
0xC00C0CC0u,// 57 1100 0000 0000 1100 : 0000 1100 1100 0000 = 2200110011002200
0xCCCC0330u,// 58 1100 1100 1100 1100 : 0000 0011 0011 0000 = 2200221122112200
0x90006000u,// 59 1001 0000 0000 0000 : 0110 0000 0000 0000 = 2112000000000000
0x08088080u,// 60 0000 1000 0000 1000 : 1000 0000 1000 0000 = 1000200010002000
0xEEEE1010u,// 61 1110 1110 1110 1110 : 0001 0000 0001 0000 = 2221222022212220
0xFFF0000Au,// 62 1111 1111 1111 0000 : 0000 0000 0000 1010 = 2222222222221010
0x731008CEu,// 63 0111 0011 0001 0000 : 0000 1000 1100 1110 = 0222102211021110
};
CMP_CONSTANT CGV_EPOCODE rampI[5*SOURCE_BLOCK_SIZE] = {
0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 0 bit index
0 ,64,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 1 bit index
0 ,21,43,64,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 2 bit index
0 ,9 ,18,27,37,46,55,64,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 , // 3 bit index
0 ,4 ,9 ,13,17,21,26,30,34,38,43,47,51,55,60,64 // 4 bit index
};
// same as CMP SDK v3.1 BC7_FIXUPINDEX1 & BC7_FIXUPINDEX2 for each partition range 0..63
// The data is saved as a packed INT = (BC7_FIXUPINDEX1 << 4 + BC7_FIXUPINDEX2)
CMP_CONSTANT CGV_FIXUPINDEX FIXUPINDEX[] = {
// 2 subset partitions 0..63
0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u,
0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x80u, 0x80u, 0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x80u, 0x80u, 0x20u, 0x20u,
0xf0u, 0xf0u, 0x60u, 0x80u, 0x20u, 0x80u, 0xf0u, 0xf0u, 0x20u, 0x80u, 0x20u, 0x20u, 0x20u, 0xf0u, 0xf0u, 0x60u,
0x60u, 0x20u, 0x60u, 0x80u, 0xf0u, 0xf0u, 0x20u, 0x20u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0xf0u, 0x20u, 0x20u, 0xf0u,
// 3 subset partitions 64..128
0x3fu, 0x38u, 0xf8u, 0xf3u, 0x8fu, 0x3fu, 0xf3u, 0xf8u, 0x8fu, 0x8fu, 0x6fu, 0x6fu, 0x6fu, 0x5fu, 0x3fu, 0x38u,
0x3fu, 0x38u, 0x8fu, 0xf3u, 0x3fu, 0x38u, 0x6fu, 0xa8u, 0x53u, 0x8fu, 0x86u, 0x6au, 0x8fu, 0x5fu, 0xfau, 0xf8u,
0x8fu, 0xf3u, 0x3fu, 0x5au, 0x6au, 0xa8u, 0x89u, 0xfau, 0xf6u, 0x3fu, 0xf8u, 0x5fu, 0xf3u, 0xf6u, 0xf6u, 0xf8u,
0x3fu, 0xf3u, 0x5fu, 0x5fu, 0x5fu, 0x8fu, 0x5fu, 0xafu, 0x5fu, 0xafu, 0x8fu, 0xdfu, 0xf3u, 0xcfu, 0x3fu, 0x38u
};
#ifndef ASPM_GPU
// =============================== USED BY DECODER THIS CODE NEEDS TO BE UPDATED =========================================
CMP_CONSTANT CGU_UINT32 BC7_FIXUPINDICES_LOCAL[MAX_SUBSETS][MAX_PARTITIONS][3] =
{
// One subset
{
{0, 0, 0},
},
{
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 2},{0, 8},{0, 2},
{0, 2},{0, 8},{0, 8},{0, 15},
{0, 2},{0, 8},{0, 2},{0, 2},
{0, 8},{0, 8},{0, 2},{0, 2},
{0, 15},{0, 15},{0, 6},{0, 8},
{0, 2},{0, 8},{0, 15},{0, 15},
{0, 2},{0, 8},{0, 2},{0, 2},
{0, 2},{0, 15},{0, 15},{0, 6},
{0, 6},{0, 2},{0, 6},{0, 8},
{0, 15},{0, 15},{0, 2},{0, 2},
{0, 15},{0, 15},{0, 15},{0, 15},
{0, 15},{0, 2},{0, 2},{0, 15},
},
// Three subsets
{
{0, 3,15}, {0, 3, 8}, {0,15, 8}, {0,15, 3},
{0, 8,15}, {0, 3,15}, {0,15, 3}, {0,15, 8},
{0, 8,15}, {0, 8,15}, {0, 6,15}, {0, 6,15},
{0, 6,15}, {0, 5,15}, {0, 3,15}, {0, 3, 8},
{0, 3,15}, {0, 3, 8}, {0, 8,15}, {0,15, 3},
{0, 3,15}, {0, 3, 8}, {0, 6,15}, {0,10, 8},
{0, 5, 3}, {0, 8,15}, {0, 8, 6}, {0, 6,10},
{0, 8,15}, {0, 5,15}, {0,15,10}, {0,15, 8},
{0, 8,15}, {0,15, 3}, {0, 3,15}, {0, 5,10},
{0, 6,10}, {0,10, 8}, {0, 8, 9}, {0,15,10},
{0,15, 6}, {0, 3,15}, {0,15, 8}, {0, 5,15},
{0,15, 3}, {0,15, 6}, {0,15, 6}, {0,15, 8},
{0, 3,15}, {0,15, 3}, {0, 5,15}, {0, 5,15},
{0, 5,15}, {0, 8,15}, {0, 5,15}, {0,10,15},
{0, 5,15}, {0,10,15}, {0, 8,15}, {0,13,15},
{0,15, 3}, {0,12,15}, {0, 3,15}, {0, 3, 8}
},
};
CMP_STATIC void SetDefaultBC7Options(BC7_Encode *BC7Encode)
{
if (BC7Encode)
{
// Set for max quality
BC7Encode->quality = 1.0f;
BC7Encode->minThreshold = 5.0f;
BC7Encode->maxThreshold = 80.0f;
BC7Encode->errorThreshold = 5.0f;
BC7Encode->validModeMask = 0xFF;
BC7Encode->imageNeedsAlpha = FALSE;
BC7Encode->colourRestrict = FALSE;
BC7Encode->alphaRestrict = FALSE;
BC7Encode->channels = 4;
BC7Encode->part_count = 128;
}
}
#ifndef ASPM
//=====================
// Used by Decoder
//=====================
__constant CGU_FLOAT rampLerpWeightsBC7[5][16] =
{
{ 0.0 }, // 0 bit index
{ 0.0, 1.0 }, // 1 bit index
{ 0.0, 21.0 / 64.0, 43.0 / 64.0, 1.0 }, // 2 bit index
{ 0.0, 9.0 / 64.0, 18.0 / 64.0, 27.0 / 64.0, 37.0 / 64.0, 46.0 / 64.0, 55.0 / 64.0, 1.0 }, // 3 bit index
{ 0.0, 4.0 / 64.0, 9.0 / 64.0, 13.0 / 64.0, 17.0 / 64.0, 21.0 / 64.0, 26.0 / 64.0, 30.0 / 64.0,
34.0 / 64.0, 38.0 / 64.0, 43.0 / 64.0, 47.0 / 64.0, 51.0 / 64.0, 55.0 / 64.0, 60.0 / 64.0, 1.0 } // 4 bit index
};
__constant CGU_UINT8 BC7_PARTITIONS[MAX_SUBSETS][MAX_PARTITIONS][MAX_SUBSET_SIZE] =
{
// Single subset partitions for both BC6H abd BC7
{
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
},
},
{
{ // 0
0,0,1,1,
0,0,1,1,
0,0,1,1,
0,0,1,1
},
{ // 1
0,0,0,1,
0,0,0,1,
0,0,0,1,
0,0,0,1
},
{ // 2
0,1,1,1,
0,1,1,1,
0,1,1,1,
0,1,1,1
},
{ // 3
0,0,0,1,
0,0,1,1,
0,0,1,1,
0,1,1,1
},
{ // 4
0,0,0,0,
0,0,0,1,
0,0,0,1,
0,0,1,1
},
{ // 5
0,0,1,1,
0,1,1,1,
0,1,1,1,
1,1,1,1
},
{ // 6
0,0,0,1,
0,0,1,1,
0,1,1,1,
1,1,1,1
},
{ // 7
0,0,0,0,
0,0,0,1,
0,0,1,1,
0,1,1,1
},
{ // 8
0,0,0,0,
0,0,0,0,
0,0,0,1,
0,0,1,1
},
{ // 9
0,0,1,1,
0,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 10
0,0,0,0,
0,0,0,1,
0,1,1,1,
1,1,1,1
},
{ // 11
0,0,0,0,
0,0,0,0,
0,0,0,1,
0,1,1,1
},
{ // 12
0,0,0,1,
0,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 13
0,0,0,0,
0,0,0,0,
1,1,1,1,
1,1,1,1
},
{ // 14
0,0,0,0,
1,1,1,1,
1,1,1,1,
1,1,1,1
},
{ // 15
0,0,0,0,
0,0,0,0,
0,0,0,0,
1,1,1,1
},
{ // 16
0,0,0,0,
1,0,0,0,
1,1,1,0,
1,1,1,1
},
{ // 17
0,1,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0
},
{ // 18
0,0,0,0,
0,0,0,0,
1,0,0,0,
1,1,1,0
},
{ // 19
0,1,1,1,
0,0,1,1,
0,0,0,1,
0,0,0,0
},
{ // 20
0,0,1,1,
0,0,0,1,
0,0,0,0,
0,0,0,0
},
{ // 21
0,0,0,0,
1,0,0,0,
1,1,0,0,
1,1,1,0
},
{ // 22
0,0,0,0,
0,0,0,0,
1,0,0,0,
1,1,0,0
},
{ // 23
0,1,1,1,
0,0,1,1,
0,0,1,1,
0,0,0,1
},
{ // 24
0,0,1,1,
0,0,0,1,
0,0,0,1,
0,0,0,0
},
{ // 25
0,0,0,0,
1,0,0,0,
1,0,0,0,
1,1,0,0
},
{ // 26
0,1,1,0,
0,1,1,0,
0,1,1,0,
0,1,1,0
},
{ // 27
0,0,1,1,
0,1,1,0,
0,1,1,0,
1,1,0,0
},
{ // 28
0,0,0,1,
0,1,1,1,
1,1,1,0,
1,0,0,0
},
{ // 29
0,0,0,0,
1,1,1,1,
1,1,1,1,
0,0,0,0
},
{ // 30
0,1,1,1,
0,0,0,1,
1,0,0,0,
1,1,1,0
},
{ // 31
0,0,1,1,
1,0,0,1,
1,0,0,1,
1,1,0,0
},
// ----------- BC7 only shapes from here on -------------
{ // 32
0,1,0,1,
0,1,0,1,
0,1,0,1,
0,1,0,1
},
{ // 33
0,0,0,0,
1,1,1,1,
0,0,0,0,
1,1,1,1
},
{ // 34
0,1,0,1,
1,0,1,0,
0,1,0,1,
1,0,1,0
},
{ // 35
0,0,1,1,
0,0,1,1,
1,1,0,0,
1,1,0,0
},
{ // 36
0,0,1,1,
1,1,0,0,
0,0,1,1,
1,1,0,0
},
{ // 37
0,1,0,1,
0,1,0,1,
1,0,1,0,
1,0,1,0
},
{ // 38
0,1,1,0,
1,0,0,1,
0,1,1,0,
1,0,0,1
},
{ // 39
0,1,0,1,
1,0,1,0,
1,0,1,0,
0,1,0,1
},
{ // 40
0,1,1,1,
0,0,1,1,
1,1,0,0,
1,1,1,0
},
{ // 41
0,0,0,1,
0,0,1,1,
1,1,0,0,
1,0,0,0
},
{ // 42
0,0,1,1,
0,0,1,0,
0,1,0,0,
1,1,0,0
},
{ // 43
0,0,1,1,
1,0,1,1,
1,1,0,1,
1,1,0,0
},
{ // 44
0,1,1,0,
1,0,0,1,
1,0,0,1,
0,1,1,0
},
{ // 45
0,0,1,1,
1,1,0,0,
1,1,0,0,
0,0,1,1
},
{ // 46
0,1,1,0,
0,1,1,0,
1,0,0,1,
1,0,0,1
},
{ // 47
0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0
},
{ // 48
0,1,0,0,
1,1,1,0,
0,1,0,0,
0,0,0,0
},
{ // 49
0,0,1,0,
0,1,1,1,
0,0,1,0,
0,0,0,0
},
{ // 50
0,0,0,0,
0,0,1,0,
0,1,1,1,
0,0,1,0
},
{ // 51
0,0,0,0,
0,1,0,0,
1,1,1,0,
0,1,0,0
},
{ // 52
0,1,1,0,
1,1,0,0,
1,0,0,1,
0,0,1,1
},
{ // 53
0,0,1,1,
0,1,1,0,
1,1,0,0,
1,0,0,1
},
{ // 54
0,1,1,0,
0,0,1,1,
1,0,0,1,
1,1,0,0
},
{ // 55
0,0,1,1,
1,0,0,1,
1,1,0,0,
0,1,1,0
},
{ // 56
0,1,1,0,
1,1,0,0,
1,1,0,0,
1,0,0,1
},
{ // 57
0,1,1,0,
0,0,1,1,
0,0,1,1,
1,0,0,1
},
{ // 58
0,1,1,1,
1,1,1,0,
1,0,0,0,
0,0,0,1
},
{ // 59
0,0,0,1,
1,0,0,0,
1,1,1,0,
0,1,1,1
},
{ // 60
0,0,0,0,
1,1,1,1,
0,0,1,1,
0,0,1,1
},
{ // 61
0,0,1,1,
0,0,1,1,
1,1,1,1,
0,0,0,0
},
{ // 62
0,0,1,0,
0,0,1,0,
1,1,1,0,
1,1,1,0
},
{ // 63
0,1,0,0,
0,1,0,0,
0,1,1,1,
0,1,1,1
},
},
// Table.P3 - only for BC7
{
{
0,0,1,1,
0,0,1,1,
0,2,2,1,
2,2,2,2
},
{
0,0,0,1,
0,0,1,1,
2,2,1,1,
2,2,2,1
},
{
0,0,0,0,
2,0,0,1,
2,2,1,1,
2,2,1,1
},
{
0,2,2,2,
0,0,2,2,
0,0,1,1,
0,1,1,1
},
{
0,0,0,0,
0,0,0,0,
1,1,2,2,
1,1,2,2
},
{
0,0,1,1,
0,0,1,1,
0,0,2,2,
0,0,2,2
},
{
0,0,2,2,
0,0,2,2,
1,1,1,1,
1,1,1,1
},
{
0,0,1,1,
0,0,1,1,
2,2,1,1,
2,2,1,1
},
{
0,0,0,0,
0,0,0,0,
1,1,1,1,
2,2,2,2
},
{
0,0,0,0,
1,1,1,1,
1,1,1,1,
2,2,2,2
},
{
0,0,0,0,
1,1,1,1,
2,2,2,2,
2,2,2,2
},
{
0,0,1,2,
0,0,1,2,
0,0,1,2,
0,0,1,2
},
{
0,1,1,2,
0,1,1,2,
0,1,1,2,
0,1,1,2
},
{
0,1,2,2,
0,1,2,2,
0,1,2,2,
0,1,2,2
},
{
0,0,1,1,
0,1,1,2,
1,1,2,2,
1,2,2,2
},
{
0,0,1,1,
2,0,0,1,
2,2,0,0,
2,2,2,0
},
{
0,0,0,1,
0,0,1,1,
0,1,1,2,
1,1,2,2
},
{
0,1,1,1,
0,0,1,1,
2,0,0,1,
2,2,0,0
},
{
0,0,0,0,
1,1,2,2,
1,1,2,2,
1,1,2,2
},
{
0,0,2,2,
0,0,2,2,
0,0,2,2,
1,1,1,1
},
{
0,1,1,1,
0,1,1,1,
0,2,2,2,
0,2,2,2
},
{
0,0,0,1,
0,0,0,1,
2,2,2,1,
2,2,2,1
},
{
0,0,0,0,
0,0,1,1,
0,1,2,2,
0,1,2,2
},
{
0,0,0,0,
1,1,0,0,
2,2,1,0,
2,2,1,0
},
{
0,1,2,2,
0,1,2,2,
0,0,1,1,
0,0,0,0
},
{
0,0,1,2,
0,0,1,2,
1,1,2,2,
2,2,2,2
},
{
0,1,1,0,
1,2,2,1,
1,2,2,1,
0,1,1,0
},
{
0,0,0,0,
0,1,1,0,
1,2,2,1,
1,2,2,1
},
{
0,0,2,2,
1,1,0,2,
1,1,0,2,
0,0,2,2
},
{
0,1,1,0,
0,1,1,0,
2,0,0,2,
2,2,2,2
},
{
0,0,1,1,
0,1,2,2,
0,1,2,2,
0,0,1,1
},
{
0,0,0,0,
2,0,0,0,
2,2,1,1,
2,2,2,1
},
{
0,0,0,0,
0,0,0,2,
1,1,2,2,
1,2,2,2
},
{
0,2,2,2,
0,0,2,2,
0,0,1,2,
0,0,1,1
},
{
0,0,1,1,
0,0,1,2,
0,0,2,2,
0,2,2,2
},
{
0,1,2,0,
0,1,2,0,
0,1,2,0,
0,1,2,0
},
{
0,0,0,0,
1,1,1,1,
2,2,2,2,
0,0,0,0
},
{
0,1,2,0,
1,2,0,1,
2,0,1,2,
0,1,2,0
},
{
0,1,2,0,
2,0,1,2,
1,2,0,1,
0,1,2,0
},
{
0,0,1,1,
2,2,0,0,
1,1,2,2,
0,0,1,1
},
{
0,0,1,1,
1,1,2,2,
2,2,0,0,
0,0,1,1
},
{
0,1,0,1,
0,1,0,1,
2,2,2,2,
2,2,2,2
},
{
0,0,0,0,
0,0,0,0,
2,1,2,1,
2,1,2,1
},
{
0,0,2,2,
1,1,2,2,
0,0,2,2,
1,1,2,2
},
{
0,0,2,2,
0,0,1,1,
0,0,2,2,
0,0,1,1
},
{
0,2,2,0,
1,2,2,1,
0,2,2,0,
1,2,2,1
},
{
0,1,0,1,
2,2,2,2,
2,2,2,2,
0,1,0,1
},
{
0,0,0,0,
2,1,2,1,
2,1,2,1,
2,1,2,1
},
{
0,1,0,1,
0,1,0,1,
0,1,0,1,
2,2,2,2
},
{
0,2,2,2,
0,1,1,1,
0,2,2,2,
0,1,1,1
},
{
0,0,0,2,
1,1,1,2,
0,0,0,2,
1,1,1,2
},
{
0,0,0,0,
2,1,1,2,
2,1,1,2,
2,1,1,2
},
{
0,2,2,2,
0,1,1,1,
0,1,1,1,
0,2,2,2
},
{
0,0,0,2,
1,1,1,2,
1,1,1,2,
0,0,0,2
},
{
0,1,1,0,
0,1,1,0,
0,1,1,0,
2,2,2,2
},
{
0,0,0,0,
0,0,0,0,
2,1,1,2,
2,1,1,2
},
{
0,1,1,0,
0,1,1,0,
2,2,2,2,
2,2,2,2
},
{
0,0,2,2,
0,0,1,1,
0,0,1,1,
0,0,2,2
},
{
0,0,2,2,
1,1,2,2,
1,1,2,2,
0,0,2,2
},
{
0,0,0,0,
0,0,0,0,
0,0,0,0,
2,1,1,2
},
{
0,0,0,2,
0,0,0,1,
0,0,0,2,
0,0,0,1
},
{
0,2,2,2,
1,2,2,2,
0,2,2,2,
1,2,2,2
},
{
0,1,0,1,
2,2,2,2,
2,2,2,2,
2,2,2,2
},
{
0,1,1,1,
2,0,1,1,
2,2,0,1,
2,2,2,0
},
},
};
#endif
#endif // !ASPM_GPU
#endif